lisp - 预定义全局变量的词法绑定(bind)

标签 lisp elisp

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

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

(funcall test)
我的理解是,自从 lexical-binding为真,则值为 1 的 x 应涵盖 let 的范围,其中应包括 xlambda 的定义中,因此,测试应该返回值 1 而不是 0,但结果返回 0,即 x 的值通过 defvar .
我是不是误会了什么?
更新
只是为了澄清,我想在这里表达我的理解。动态边界意味着它只有一个符号,并且值在堆栈中弹出和弹出。因此,当 lambda 的定义完成后,let 中使用的值被弹出。
词法/静态边界意味着值总是在词法环境的上下文中检查,所以只要有 let之前 lambda定义,let 中的值用来。defvar 定义的变量总是动态绑定(bind)的,因此,这里的词法绑定(bind)控制没有任何区别。

最佳答案

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

关于lisp - 预定义全局变量的词法绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66996296/

相关文章:

recursion - 将递归函数定义为迭代?

lisp - let、eval 和 quote 的行为

emacs - 测试点是否在匹配引号之间(emacs lisp)

emacs - C-x 在 CUA 模式下的标准行为

file - Lisp if 语句 - emacs 初始化文件 ".emacs"

lisp - 剪辑错误 : PRINC: argument is not a stream

lisp - Racket 中 C float 的正确指针类型转换是什么?

Emacs -- 在 Emacs lisp 中定时执行函数调用

Emacs 将操作附加到按下的任意键

emacs - 是否可以自动保存不访问文件的临时缓冲区?