如何用`lambda`重写`let*`?

Sol*_*ves 8 lambda scheme

我明白怎么(let ((x v1) (y v2)) e)可以改写成((lambda (x y) e) v1 v2).但我不太熟悉let*.

我们如何(let* ((x v1) (y v2) (z v3)) e)在lambda和函数应用程序方面重写?

Ósc*_*pez 4

这个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的在线书籍: