Scheme 中的两个函数有什么区别,其中一个定义如下 -
(define doSomething
(lambda (x)
(let (f (100))
(f x))))
另一个是这样的?-
(define doSomething
(let (f (100))
(lambda (x)
(f x))))
换句话说,lambda
是在 let
之前还是之后有什么关系?
最佳答案
您的代码将无法运行。 :-)
我假设您指的是这些:
(lambda (x)
(let ((f 100))
(+ f x)))
和
(let ((f 100))
(lambda (x)
(+ f x)))
在这两种情况下,您都会返回传入的参数加上 100。
但是,主要区别(忽略有关 let
如何只是 lambda
的语法糖的技术细节)是在第二个版本中,f
是一个自由变量。假设我们这样做:
(let ((f 100))
(list (lambda (x)
(+ f x))
(lambda (x)
(set! f x))))
这会返回一个包含两个 lambda 的列表:第一个与之前的相同,第二个允许您更改 f
的值。两个 lambda 访问相同的 f
,因此运行 setter将影响稍后对第一个 lambda 的调用。
关于lambda - 嵌套let和lambda在Scheme中的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5523048/