过程中的 Lambda

Lambda in the procedure

有人可以向我解释一下以下代码中的两个 lambda 语句发生了什么吗?

(define (remove x ls)
(if (null? ls)
  '()
  (let ((h (car ls)))
    ((if (eqv? x h)
        (lambda (y) y)
        (lambda (y) (cons h y)))
     (remove x (cdr ls))))))

上面代码中的'y'是什么?

根据 if 的条件,我们返回一个或另一个 lambda 然后立即应用它(注意 [=11= 左边的双左括号]).第一个 lambda returns 调用递归的结果,第二个 lambda cons 将一个元素添加到调用递归的结果中,无论哪种方式调用递归。 y 只是 lambda 的参数名称,它绑定到 (remove x (cdr ls)) 的值。整个事情就相当于这样,实际上应该这样写,而不是现在那种过于复杂的形式:

(define (remove x ls)
  (if (null? ls)
      '()
      (let ((h (car ls)))
        (if (eqv? x h) ; using `equal?` would be a better idea
            (remove x (cdr ls))
            (cons h (remove x (cdr ls)))))))