「TheSeasonedSchemer」を読みながら、私はについて学び始めましたletrec
。私はそれが何をするのかを理解しています(Y-Combinatorで複製できます)が、本はdefine
静的なままの引数で動作するすでにd関数を繰り返す代わりにそれを使用しています。
define
それ自体で繰り返されるd関数を使用する古い関数の例(特別なことは何もありません):
(define (substitute new old l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (substitute new old (cdr l))))
(else
(cons (car l) (substitute new old (cdr l))))))
同じ関数の例ですが、以下を使用しletrec
ます。
(define (substitute new old l)
(letrec
((replace
(lambda (l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (replace (cdr l))))
(else
(cons (car l) (replace (cdr l))))))))
(replace lat)))
少し長くて読みにくいことを除けば、なぜ彼らがletrecを使用するために本の関数を書き直しているのかわかりません。あなたがそれを渡し続けないので、このように静的変数を繰り返すときの速度の向上はありますか?
これは、引数が静的なままであるが、1つの引数が削減されている関数(リストの要素を繰り返すなど)の標準的な方法ですか?
より経験豊富なSchemers/LISPersからのいくつかの入力が役立ちます!