为什么词法绑定在 emacs 的这个例子中不起作用?

Why is lexical binding not working in this example in emacs?

我从 emacs wiki 复制粘贴了这个示例:https://www.emacswiki.org/emacs/DynamicBindingVsLexicalBinding#toc2

wiki上说打印的东西应该是1,但是我打印的是2,说明词法绑定不起作用。有谁知道为什么会这样吗?

我正在使用 Emacs v26。 Debian.

这是我缓冲区中的字面意思。我正在用 M-x eval-buffer.

评估它
;; -*- lexical-binding: t;-*-

(let ((a 1))                            ; binding (1)
  (let ((f (lambda () (print a))))
    (let ((a 2))                        ; binding (2)
      (funcall f))))

非常感谢你的帮助。

您将 lexical-binding 设置为文件变量。它在文件打开时设置,所以如果你只是将文本添加到文件而不关闭它并重新打开它,lexical-binding 的值仍然是 nil(执行 C-h v lexical-binding RET 并自己看看) .所以你使用的是动态绑定,你得到的值是 2。

如果您关闭并重新打开文件,文件变量 将被设置 (检查它!)并且当您评估表单时,您将得到 1。