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

Bru*_*rić 3 emacs elisp

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

维基说打印出来的东西应该是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))))
Run Code Online (Sandbox Code Playgroud)

我会很感激你的帮助。

Nic*_*ckD 5

您设置lexical-binding为文件变量。这会在文件打开时设置,因此如果您只是将文本添加到文件中而不关闭并重新打开它,则 的值lexical-binding仍然为零(请自行C-h v lexical-binding RET查看)。因此,您正在使用动态绑定,并且您将获得 2 的值。

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