首页 > 解决方案 > 预定义全局变量的词法绑定

问题描述

这是让我感到困惑的片段:

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

(funcall test)

我的理解是,既然lexical-binding是真的,那么值 1 的 x 应该涵盖 的范围let,这应该包括x在 的定义中lambda,因此,测试应该返回值 1 而不是 0,但结果是返回 0 ,这是xby的值defvar

我是不是误会了什么?

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

标签: lispelisp

解决方案


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


推荐阅读