几年前,我开始为一种小型领域特定语言编写解释器,其中包括程序员定义的函数。
起初,我使用简单的符号表堆栈实现了变量作用域。但现在我想转向正确的词法范围(带有闭包选项)。谁能解释词法范围背后的数据结构和算法?
要在解释器中获得正确的词法作用域和闭包,您需要做的就是遵循以下规则:
- 在你的解释器中,变量总是在环境表中查找由调用者传入或保存为变量,而不是一些全局环境堆栈。您的 eval 操作的签名就像
eval(expression, env) => value
.
- 当解释代码调用函数时,环境是NOT传递给该函数。您的函数应用程序操作的签名如下
apply(function, arguments) => value
.
- 当调用解释函数时,其函数体求值的环境是函数定义的环境,与调用者没有任何关系。所以如果你有一个局部函数,那么它就是一个closure,即包含字段的数据结构
{function definition, env-at-definition-time}
.
扩展 Python 式语法的最后一点:
x = 1
return lambda y: x + y
应该像执行一样执行
x = 1
return make_closure(<AST for "lambda y: x + y">, {"x": x})
其中第二个 dict 参数可能只是 current-env 而不是当时构造的数据结构。 (另一方面,保留整个环境而不仅仅是封闭变量可能意味着程序会出现令人惊讶的内存泄漏,因为闭包保留了不需要的东西。这在任何“实用”语言实现中都值得修复,但不值得当你刚刚尝试语言语义时。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)