我在方案中有一段使用多个 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。我该怎么做?
最佳答案
要删除表达式中的所有 lambda,您可以执行以下操作:
- 将过程定义从此形式:
(define f (lambda (x) x))
替换为以下等效形式:(define (f x) x)
< - 将
letrec
表达式替换为内部定义 - 将最后一行中的
lambda
替换为另一个内部定义,命名并在最后调用它 - 更简单:请注意,您实际上并不需要最后一个
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))
请注意,lambda
并没有真正被消除,它们仍然存在于底层 - 隐藏在一些语法糖后面。
关于lambda - 使用 lambda 的方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860734/