gpt4 book ai didi

programming-languages - 词法范围是如何实现的?

转载 作者:行者123 更新时间:2023-12-04 05:01:21 24 4
gpt4 key购买 nike

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

3年前关闭。




Improve this question




几年前,我开始为一种包含程序员定义函数的领域特定语言编写解释器。

起初,我使用一个简单的符号表堆栈来实现变量作用域。但现在我想转向适当的词法范围(可以选择闭包)。谁能解释词法作用域背后的数据结构和算法?

最佳答案

要在解释器中获得正确的词法范围和闭包,您需要做的就是遵循以下规则:

  • 在你的解释器中,变量总是在调用者传入的环境表中查找或作为变量保存,而不是一些全局环境堆栈。您的 eval 操作的签名类似于 eval(expression, env) => value .
  • 当解释代码调用函数时,环境不会传递给该函数。你的函数应用操作的签名就像apply(function, arguments) => value .
  • 当一个解释函数被调用时,它的函数体被评估的环境是 进行函数定义的环境,并且与来电者没有任何关系。所以如果你有一个局部函数,那么它就是一个闭包,也就是一个包含字段{function definition, env-at-definition-time}的数据结构。 .

  • 要扩展 Python-ish 语法中的最后一点:
    x = 1
    return lambda y: x + y

    应该像执行一样执行
    x = 1
    return make_closure(<AST for "lambda y: x + y">, {"x": x})

    其中第二个 dict 参数可能只是 current-env 而不是当时构造的数据结构。 (另一方面,保留整个 env 而不仅仅是封闭的变量可能意味着程序有令人惊讶的内存泄漏,因为闭包会保留不需要的东西。这值得在任何“实际”语言实现中修复,但不是当您只是在尝试语言语义时。)

    关于programming-languages - 词法范围是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384157/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com