按我自己的理解, 第一次运行时, 第一个 message 输出 This is a variable!, 而第二个 message 应该是输出 I'am local variable!, 因为第二个 message 不是在 let 的范围内的, 应该是 (setq foo I'am local variable!)起作用了. 但是作者给出的答案明显不是如我所想的. 这个答案虽然有,但还是无法理解, elisp 新手求解答…
(progn
(setq foo "I'm local variable!") ; 全局
(let ((foo "I'm local variable!")) ; 局部
;; 创建 buffer-local variable,覆盖了 let 定义的 foo symbol
(set (make-local-variable 'foo) "I'm buffer-local variable!")
;; 修改的是 buffer-local foo
(setq foo "This is a variable!")
(message "%s" foo))
;; 读到的是 buffer-local foo
(message "%s" foo))
第二次运行输出
This is a variable!
I'm local variable!
是因为一个注释过的行为:
If the variable is already arranged to become local when set, this function causes a local value to exist for this buffer, just as setting the variable would do.
也就是代码相当于
(progn
(setq foo "I'm local variable!")
(let ((foo "I'm local variable!"))
;; (set (make-local-variable 'foo) "I'm buffer-local variable!")
;; 相当于
(set 'foo "I'm buffer-local variable!")
;; 上下两句修改的是 let 定义的 foo
(setq foo "This is a variable!")
(message "%s" foo))
;; 读到的是 buffer-local foo
(message "%s" foo))