Reasoned Schemer (64) 読み返し10章(続き3)
お次はこれ
(let ((s-inf ((disj2 (nevero) (== 'olive x)) empty-s))) s-inf)
= ((disj2 (nevero) (== 'olive x)) empty-s)
= ((lambda (s) ((nevero) s) (append-inf ((== 'olive x) s))) empty-s)
= (append-inf ((nevero) empty-s) ((== 'olive x) empty-s))
= (append-inf (lambda () ((nevero) empty-s)) `(((,x . olive))))
s-inf
がnullでもpairでもないから!
s-inf
とt-inf
が入れ替わって!
= (lambda () (append-inf `(((,x . olive))) ((lambda () ((nevero) empty-s)))))
suspensionができる
s-inf
を1回評価すると昨日の式と同じ形
(let ((s-inf ((disj2 (nevero) (== 'olive x)) empty-s))) (s-inf))
= ((lambda () (append-inf `(((,x . olive))) ((lambda () ((nevero) empty-s))))))
= (append-inf `(((,x . olive))) ((lambda () ((nevero) empty-s))))
= (append-inf `(((,x . olive))) ((nevero) empty-s))
= (append-inf `(((,x . olive))) (lambda () ((nevero) empty-s)))
= ...
= `(((,x . olive)) . (lambda () ((nevero) empty-s))
ここから何を知るべきか
nevero
みたいに無限ループしそうな定義がdisj2
に含まれていても
suspensionのおかげで両方の式が少しずつ評価されるよ、ってことでいいかな
always
はどんな風に動くか
と思って前にもやってるんだよな振り返ってみると
((alwayso) empty-s)
= ((lambda (s) (lambda () ((disj2 succeed (alwayso)) s))) empty-s)
= (lambda () ((disj2 succeed (alwayso)) empty-s))
(((alwayso) empty-s))
= ((lambda () ((disj2 succeed (alwayso)) empty-s)))
= ((disj2 succeed (alwayso)) empty-s)
= (append-inf (succeed empty-s) ((alwayso) empty-s))
= (append-inf `(()) (lambda () ((disj2 succeed (alwayso)) empty-s)))
= `(() . ,(lambda () ((disj2 succeed (alwayso)) empty-s)))
前よりはイメージできるようになった気がする
これくらいでいいか