kb84tkhrのブログ

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

Reasoned Schemer (58) 10章 ifte

興奮するのもいいけど、なにか忘れてませんか?
condaconduはどうしたっけ

そうですね

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、つながりはありそうだけどどういうことかな