SICP 読み (126) 3.5.1 ストリームは遅延リスト
問題 3.50 の続きから。
stream-ref があると確認が楽そげなんで、試験を以下のような感じに。
("stream-ref" ("1 - 10" (let f ((s (stream-enumerate-interval 0 10)) (i 0)) (if (> i 10) 'done (begin (assert-equal i (stream-ref s i)) (f s (+ i 1)))) ) ) ) ("stream-map" ("sample 1" (let f ((s (stream-map (lambda (x) (* x x)) (stream-enumerate-interval 1 4))) (i 1)) (if (> i 4) 'done (begin (assert-equal (* i i) (stream-ref s (- i 1))) (f s (+ i 1)))) ) ) ("sample 2" (let f ((s (stream-map + (stream-enumerate-interval 1 10) (stream-enumerate-interval 21 30) (stream-enumerate-interval 101 110))) (i 1)) (if (> i 10) 'done (begin (assert-equal (+ i (+ i 20) (+ i 100)) (stream-ref s (- i 1))) (f s (+ i 1)))) ) ) ("sample 3" (let f ((s (stream-map (lambda (x y) (+ x (* 2 y))) (stream-enumerate-interval 1 5) (stream-enumerate-interval 6 10))) (i 1)) (if (> i 5) 'done (begin (assert-equal (+ i (* 2 (+ i 5))) (stream-ref s (- i 1))) (f s (+ i 1)))) ) ) )
なんか微妙。例示されている他の手続きは別途で、問題 3.51 なソレを机上ベースでトライしてみます。
問題 3.51
ヤリかけたんですが、評価される順番が微妙なのでやり直す。特殊形式は引数を評価するより優先度が高い、という事は分かった (って今更) んですが、サケ飲んでヤッてるんで順番がぐちゃぐちゃになってしまった。
それにしても紙と鉛筆でヤるには手続きの名前が長すぎ。
と言いつつちょっとだけ
トレイスしている材料をちょっとだけ整理。まず以下の式
(define x (stream-map show (stream-enumerate-interval 0 10)))
で x に束縛されるのは何か、をまず把握する必要あり。まず stream-enumerate-interval はどうなるか、というと
(cons-stream 0 (stream-enumerate-interval 1 10))
で、上記の式は以下となる。
(cons 0 (delay (stream-enumerate-interval 1 10)))
これが stream-map に渡されるので
(stream-map show (cons 0 (delay (stream-enumerate-interval 1 10))))
となり、
# stream-map は p.189 のを使います (弱
その後は以下のように展開。
(cons-stream (show (stream-car (cons 0 (delay (stream-enumerate-interval 1 10))))) (stream-map show (stream-cdr (cons 0 (delay (stream-enumerate-interval 1 10))))))
ここでどの式が優先的に評価されるか、なんですが cons-stream と見てみる。
(cons (show (stream-car (cons 0 (delay (stream-enumerate-interval 1 10))))) (delay (stream-map show (stream-cdr (cons 0 (delay (stream-enumerate-interval 1 10)))))))
で、ナカミから行くと見てまずはこうなりますか??
(cons (show 0) (delay (stream-map show (stream-cdr (cons 0 (delay (stream-enumerate-interval 1 10)))))))
次はこうなる??
(cons (show 0) (delay (stream-map show (force (delay (stream-enumerate-interval 1 10))))))
で、force 以下が評価されるとすると以下。
(cons (show 0) (delay (stream-map show (cons-stream 1 (stream-enumerate-interval 2 10)))))
で、cons-stream が優先的に評価されるとすると
(cons (show 0) (delay (stream-map show (cons 1 (delay (stream-enumerate-interval 2 10))))))
で、(show 0) なソレで 0 が印字されて以下。
(cons 0 (delay (stream-map show (cons 1 (delay (stream-enumerate-interval 2 10))))))
上記が x に束縛、という事になるんだろうか。ちなみにこの状態になるまでの印字は以下でしょうか。
gosh> (define x (stream-map show (stream-enumerate-interval 0 10))) 0 x gosh>
答えアワセが楽しみですが、ボケまくって全然違うしー、というのが確立の高い予測だったりして。(駄目
続きは別途。スデにボケをカマしまくっているのであればコメント頂ければ幸いです。> 識者な方々
エントリ投入しかけたんですが
プレビュー見ててダウトを見つけた。以下が
(cons (show 0) (delay (stream-map show (stream-cdr (cons 0 (delay (stream-enumerate-interval 1 10)))))))
こんなになる
(cons (show 0) (delay (stream-map show (force (delay (stream-enumerate-interval 1 10))))))
と書いているんですが、delay の中はそのままなのかなぁ。で、0 が印字されて
(cons 0 (delay (stream-map show (force (delay (stream-enumerate-interval 1 10))))))
が x に束縛されるオブジェクトになるんでしょうか。むむ。
とほほ
上記もダウトな気が。