SICP 読書ノート#57 - 4.2.3 遅延評価リストとしてのストリーム (pp.243-245)
遅延評価器では手続きの引数が全て遅延されるので、consセルをcompound procedureとして定義すれば、リストとストリームは同義となる。
consの手続きは§2でも出たあれだ。
(define (cons first rest) (lambda (pair) (pair first rest))) (define (car pair) (pair (lambda (f r) f))) (define (cdr pair) (pair (lambda (f r) r)))
§3のストリームは遅延されるのはcdrだけだったのに対し、この遅延リストはcarもcdrも同様に遅延ができる。これを「遅延度が高い」と言うらしい。
問題 4.32
この遅延度の高さのおかげで未定義の対が定義できる。
;;; L-Eval input: (define a-stream (cons x y)) ;; x,yは未定義の変数 ;;; L-Eval value: ok ;;; L-Eval input: a-stream ;;; L-Eval value: (compound-procedure (pair) ((pair first rest)) <procedure-env>)
§3のストリームだとx
が未定義でエラーするはず。
問題 4.33-34
あまり興味が惹かれないでパスします。
次回は「§4.3 Schemeの変形---非決定性計算」から。