宏来简化递归函数语法

Har*_*ier 2 scheme racket

当我学习计划和球拍时,我发现自己一次又一次地重复这种模式.我有一个递归函数,其中函数的一些参数改变但一些参数没有.我构建了一个外部函数,它接受所有参数并在其中定义一个内部函数,该函数仅接受更改的参数并重复该参数.

作为一个具体的例子,一个案例基于"小计划者"的功能练习

;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)) 
Run Code Online (Sandbox Code Playgroud)

是否可以构建一个宏定义*和一个运算符(例如一个垂直条),以便我输入:

(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)))]))  
Run Code Online (Sandbox Code Playgroud)

然后,这会扩展为第一种形式,所有参数都传递给外部函数,但只有垂直条传递给内部循环后的参数.

Mat*_*ard 8

您可以编写这样的宏,但您也可以使用命名的let:

(define (insert-to-right new old lat)
  (let loop ([lat lat])
    (cond
      [(null? lat)         lat]  
      [(eq? old (car lat)) (cons old (cons new (cdr lat)))]  
      [else                (cons (car lat) (loop (cdr lat)))])))
Run Code Online (Sandbox Code Playgroud)