我明白怎么(let ((x v1) (y v2)) e)可以改写成((lambda (x y) e) v1 v2).但我不太熟悉let*.
我们如何(let* ((x v1) (y v2) (z v3)) e)在lambda和函数应用程序方面重写?
这个let表达式:
(let ((x v1)
(y v2))
e)
Run Code Online (Sandbox Code Playgroud)
等价于以下lambda应用程序,请注意,这里的变量可以按任何顺序求值(不强制执行严格的从左到右的顺序),并且一个变量的定义不能引用它之前的变量:
((lambda (x y)
e)
v1 v2)
Run Code Online (Sandbox Code Playgroud)
另一方面,这个let*表达式:
(let* ((x v1)
(y v2)
(z v3))
e)
Run Code Online (Sandbox Code Playgroud)
可以转换为一系列嵌套lambda,以确保变量按照定义变量的相同顺序进行计算,并且首先定义的变量可以在所有后续定义中引用:
((lambda (x)
((lambda (y)
((lambda (z)
e)
v3))
v2))
v1)
Run Code Online (Sandbox Code Playgroud)
另一个例子:只有当我们使用第二个转换时,此代码才有效:
(let* ((x 1)
(y (+ x 1)))
(+ x y))
Run Code Online (Sandbox Code Playgroud)
y正如你所看到的,引用的定义x,只有这样才会起作用:
((lambda (x)
((lambda (y)
(+ x y))
(+ x 1)))
1)
Run Code Online (Sandbox Code Playgroud)
最后,这里有两本很棒的学习Scheme的在线书籍:
| 归档时间: |
|
| 查看次数: |
2129 次 |
| 最近记录: |