微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

预定义全局变量的词法绑定

如何解决预定义全局变量的词法绑定

这是让我困惑的片段:

(setq lexical-binding t)
(defvar x 0)
    
(setq test (let ((x 1))
            (lambda () 
               x)))

(funcall test)

我的理解是,既然lexical-binding为真,那么值1的x应该涵盖let的范围,{{1}的定义中应该包括x },因此,测试应该返回值 1 而不是 0,但结果返回 0,即 lambdax 值。

我是不是误会了什么?

更新 只是为了澄清,我想在这里发表我的理解。动态边界意味着它只有一个符号,并且值在堆栈中弹出和弹出。因此,当 defvar 的定义完成时,let 中使用的值会弹出。 词法/静态边界意味着始终在词法环境的上下文中检查该值,因此只要在 lambda 定义之前有 let,就会使用 lambda 中的值。 let 定义的变量总是动态绑定的,因此这里的词法绑定控制没有任何区别。

解决方法

根据https://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Lexical-Binding.html,即使lexical-binding 不是nil,特殊变量(比如x 因为它是用defvar 定义的)仍然是动态的绑定。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。