kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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-inft-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)))

前よりはイメージできるようになった気がする
これくらいでいいか