我\xe2\x80\x99最近冒险进入了编写Scheme解释器的伟大领域,并且我\xe2\x80\x99遇到了一个障碍:闭包。据我了解,它们封装了一个本地环境,其中包含一个每次调用闭包时都会恢复的过程(这可能不完全正确)。我在网上任何地方都能找到的问题是如何正式定义闭包,即在 EBNF 语法中。我见过的大多数例子都说闭包是一个零参数的过程,它有一个嵌套在 let 表达式中的 lambda 表达式。这是定义Scheme闭包的唯一方法吗?更重要的是,如果\xe2\x80\x99s没有正式的方法来正式定义闭包,那么你实际上如何解释它?如果将所有 let 表达式转换为 lambda 会发生什么?例如,如果我这样声明一个闭包
\n(define (foo) (let ((y 0)) (\xce\xbb (x) (\xe2\x80\xa6))))\nRun Code Online (Sandbox Code Playgroud)\n然后将其赋值给一个变量
\n(define bar (foo))\nRun Code Online (Sandbox Code Playgroud)\n按什么顺序评估?从我\xe2\x80\x99所看到的,当foo声明时,它存储一个指向父环境的指针,并声明它自己的环境。如果我调用(bar),我应该立即替换到保存的本地环境中吗?