kb84tkhrのブログ

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

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の前フリってだけだった?