私はThe Little Schemerと協力して Scheme を学び、自分の環境で PLT-Scheme を使用しています。
The Little Schemerは再帰を大いに助けてくれました (今の私にとっては簡単です) が、「コレクター」を紹介し、関数全体を継続と呼んでいる本の一部に行き詰まっています。
これが彼らが使用したサンプルコードです。私は再帰要素を理解していますが、特にラムダ関数で行き詰まっています - 私の心はパスとそのラムダ関数の引数がどのように設定されているかをたどることができません(それらの唯一の呼び出しは再帰でそれらを再度呼び出すことであるため、関数本体内での具体的な使用はありません)。
ラムダ コレクターへの関数の再帰を介した計算のパスの内訳を誰かが多かれ少なかれ教えてくれれば、それは私を助けるかもしれません。
;; Build a nested list of even numbers by removing the odd ones from its
;; argument and simultaneously multiply the even numbers and sum the odd
;; numbers that occur in its argument.
(define (even-only-collector l col)
(cond
((null? l)
(col (quote ()) 1 0))
((atom? (car l))
(cond
((even? (car l))
(even-only-collector (cdr l)
(lambda (newl p s)
(col (cons (car l) newl)
(* (car l) p) s))))
(else
(even-only-collector (cdr l)
(lambda (newl p s)
(col newl
p (+ (car l) s)))))))
(else
(even-only-collector (car l)
(lambda (al ap as)
(even-only-collector (cdr l)
(lambda (dl dp ds)
(col (cons al dl)
(* ap dp)
(+ as ds)))))))))
;; The collector function
(define (collector newl product sum)
(cons sum
(cons product newl)))
前もって感謝します!!