Reasoned Schemer (58) 10章 ifte
興奮するのもいいけど、なにか忘れてませんか?
conda
とcondu
はどうしたっけ
そうですね
ifte
ってのを定義します
IF-Then-Elseの略
(define (ifte g1 g2 g3)
(lambda (s)
(let loop ((s-inf (g1 s)))
(cond
((null? s-inf) (g3 s))
((pair? s-inf)
(append-map-inf g2 s-inf))
(else (lambda () (loop (s-inf))))))))
やってみる
> ((ifte succeed (== #f y) (== #t y)) empty-s)
(((#(y) . #f)))
> ((ifte fail (== #f y) (== #t y)) empty-s)
(((#(y) . #t)))
> ((ifte (== #t x) (== #f y) (== #t y)) empty-s)
(((#(y) . #f) (#(x) . #t)))
> ((ifte (disj2 (== #t x) (== #f x)) (== #f y) (== #t y)) empty-s)
(((#(y) . #f) (#(x) . #t))
((#(y) . #f) (#(x) . #f)))
条件節が成功・失敗両方あるときは両方の結果が並ぶんだな
(lambda (s) ...)
の中を見る
ifte
もgoalだから、substitutionのstreamを返すはず
条件節(g1 s)
を評価した結果をs-inf
として
s-inf
がnullだったら失敗だから(g3 s)
を返す
s-inf
が(nullでない)リストだったら成功だから
えーと
(append-map-inf g2 s-inf))
はどういうことになるかな
g1
かつg2
的な結果を返す、ってことでいいかな
「両方の結果が並ぶんだな」はこのへんのおかげか
それ以外だったらsuspensionということなので
forceしてもう一度
って感じ
if-then-elseとconda
、つながりはありそうだけどどういうことかな