当我学习计划和球拍时,我发现自己一次又一次地重复这种模式。我有一个递归函数,其中函数的某些参数会更改,但某些参数不会。我构建了一个接受所有参数的外部函数,并在其中定义了一个只接受不断变化的参数并在其上重复的内部函数。
作为一个具体的例子,这里有一个基于“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* (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)))]))
然后这将扩展为第一种形式,所有参数都传递给外部函数,但只有竖线之后的参数传递给内部循环。