私はスキームとラケットを学ぶので、このパターンを何度も繰り返しています。関数のパラメータの一部が変更されるが、パラメータのいくつかは変更されない再帰的な関数があるところです。私は、すべてのパラメータをとり、変化するパラメータだけを取り込んでそれを繰り返す内部関数を定義する外部関数を構築します。 「リトルスキーマー」の関数運動に幾分基づいて相続人の場合、具体的な例として再帰関数の構文を簡素化するマクロ
;inserts an item to the right of an element in a list
(define (insert-to-right new old lat)
(define (insert-to-right lat)
(cond
[(null? lat) lat]
[(eq? old (car lat)) (cons old (cons new (cdr lat)))]
[else (cons (car lat) (insert-to-right (cdr lat)))]))
(insert-to-right lat))
定義マクロを構築することが可能である*およびオペレータ(例えば垂直バー)、例えば
(define* (insert-to-right new old | lat)
(cond
[(null? lat) lat]
[(eq? old (car lat)) (cons old (cons new (cdr lat)))]
[else (cons (car lat) (insert-to-right (cdr lat)))]))
が、これは、すべての外側の関数に渡されたパラメータが、内側ループに渡されている垂直バー後にのみパラメータを持つ最初の形に拡大する:私は入力しています。
ありがとうございました。私は内部関数か名前付きletのどちらを使わなくても、どうやってそれをやり遂げることができるのだろうかと思っています。 –