小编The*_*one的帖子

计划关闭是如何正式定义的?

我\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))))\n
Run Code Online (Sandbox Code Playgroud)\n

然后将其赋值给一个变量

\n
(define bar (foo))\n
Run Code Online (Sandbox Code Playgroud)\n

按什么顺序评估?从我\xe2\x80\x99所看到的,当foo声明时,它存储一个指向父环境的指针,并声明它自己的环境。如果我调用(bar),我应该立即替换到保存的本地环境中吗?

\n

scheme closures racket

1
推荐指数
1
解决办法
233
查看次数

标签 统计

closures ×1

racket ×1

scheme ×1