@uents blog

Code wins arguments.

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の変形---非決定性計算」から。


※「SICP読書ノート」の目次はこちら