スキームとラケットを学ぶにつれて、このパターンを何度も繰り返していることに気づきます。関数のパラメーターの一部は変更されますが、一部のパラメーターは変更されない再帰関数があります。すべてのパラメーターを受け取る外側の関数を作成し、その中で変化するパラメーターのみを受け取り、それを繰り返す内側の関数を定義します。
具体的な例として、"The Little Schemer" の関数演習に多少基づいたケースを示します。
;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* と演算子 (垂直バーなど) を作成することは可能ですか?
(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)))]))
これは最初の形式に展開され、すべてのパラメーターが外側の関数に渡されますが、垂直バーの後のパラメーターのみが内側のループに渡されます。