gpt4 book ai didi

lambda - lambda 表达式中的 Racket 和未绑定(bind)标识符,与 r5rs 对比

转载 作者:行者123 更新时间:2023-12-02 06:39:17 28 4
gpt4 key购买 nike

在 DrRacket 中,当我将语言设置为 R5RS 并运行以下代码时:

(lambda (x) z)

它运行没有错误并返回 #<procedure> 。这对我来说是有道理的; lambda 形式定义了一个过程,其主体尚未被计算,因此该过程被返回。

或者,当我使用 Racket 语言方言时,我收到以下错误:

z: unbound identifier in module in: z

我不明白为什么 Racket 会产生这个错误。我的意思是,我当然看到了z是未定义的,但我对评估模型的理解是,函数体在函数定义时不会被评估。这与 R5RS 的结果一致,但与 Racket 的结果不一致。 Racket 到底在这里做什么?是否以某种方式在代码主体中“查看”变量是否已定义?评估模型与 R5RS 有何不同导致了这种不同的行为?

最佳答案

#lang 文件是模块。文档中详细描述了如何扩展和评估模块的规范。经过一番挖掘,我发现了这个注释:

No identifier can be imported or defined more than once at any phase level within a single module. Every exported identifier must be imported or defined. No expression can refer to a top-level variable.

最后一句“没有表达式可以引用顶级变量。”意味着所有变量都必须绑定(bind)。

相反,在 repl 中输入的表达式不是模块,而是任何模块“外部”的表达式。对未绑定(bind)变量的引用成为对顶级变量的引用。当计算表达式时,将在当前命名空间中查找顶级变量的值。如果在查找时,变量没有关联值,则会发出错误信号。

repl 使用这一复杂的规则来允许相互递归函数的定义,一次定义一个。

有关 REPL 的更多信息,请参阅: https://gist.github.com/samth/3083053

关于lambda - lambda 表达式中的 Racket 和未绑定(bind)标识符,与 r5rs 对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29520771/

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