4

我在方案中有一段代码,它使用了几个 lambda。它基本上返回一个中间的数字。

(define foo
  (lambda (x)
    (letrec
      ((h (lambda (y z)
        (cond
          ((null? y) 'undefined)
          ((null? (cdr y)) (car z))
          (else (h (cddr y) (cdr z)))))))
  ((lambda (y) (h y y)) x))))

我必须重写代码,使其不使用任何 lambda。我怎么做?

4

2 回答 2

4

要删除表达式中的所有 lambda,您可以执行以下操作:

  • 将过程定义从此形式:替换为(define f (lambda (x) x))等效形式:(define (f x) x)
  • letrec用内部定义替换表达式
  • 用另一个内部定义替换lambda最后一行中的,命名它并在最后调用它
  • 更简单:请注意,您实际上并不需要 last lambda,这相当于直接调用(h x x)

在连续应用上述每个替换后,过程最终如下所示:

(define (foo x)
  (define (h y z)
    (cond
      ((null? y) 'undefined)
      ((null? (cdr y)) (car z))
      (else (h (cddr y) (cdr z)))))
  (h x x))

请注意,lambdas 并没有真正消除,它们仍然存在于引擎盖下 - 隐藏在一些语法糖后面。

于 2012-06-02T13:56:34.343 回答
2

这取决于上下文和你所学的内容。如果您发布更多上下文,您很可能会得到更好的答案。

但是,首先请注意,

(define (foo x) (+ x 1)) 

相当于

(define foo (lambda (x) (+ x 1))).

摆脱letrec将其重写为内部定义。

于 2012-06-02T11:00:34.657 回答