Reasoned Schemer (51) 10章 take-inf
(define (take-inf n s-inf)
(cond
((and n (zero? n)) '())
((null? s-inf) '())
((pair? s-inf)
(cons (car s-inf)
(take-inf (and n (sub1 n)) (cdr s-inf))))
(else (take-inf n (s-inf)))))
だいたいtake
的に動く
(run n ...)
に対応するのかな
n
が#f
の時は全要素を返す
これはrun*
っぽい
s-inf
がnullだったりpairだったりのときは普通のtake
s-inf
がそれ以外、つまりsuspensionだったときは
s-inf
をforceしてもう一度
n
が#f
の時の話はオマケでs-inf
をforceするところが大事そう
> (take-inf 1 ((nevero) empty-s))
; no value
> (take-inf 3 ((alwayso) empty-s))
(() () ())
((nevero) empty-s)
はまるごとsuspensionを返すので
何回再帰してもelseにしか進まなくてループする
((alwayso) empty-s)
はpairを返すので
n
が減っていって値を返す
ただしn
が#f
だとやっぱりループして帰ってこない
前回“a list of the first two empty substitutions”とか作ってたのは
take-inf
の前フリってだけだった?