lexical binding vs. dynamic binding

我想在 elisp 中用 kill-buffer 函数杀掉某个进程 buffer,但是又想把 side effect 降到最低。

在 dynamic binding 中,我可以这样:

(let ((kill-buffer-query-functions nil)
      (kill-buffer-hook nil))
    (kill-buffer http-buffer))

在 lexical binding 中我这样做有效吗?是不是需要先 defvar 一下?还是说只要 kill-buffer-query-functionkill-buffer-hook 两个变量先于这个 feature 加载就可以了?求解惑。

defvar kill-buffer-query-functions 就可以了

2 个赞

lexical binding 必须这样处理吗?

应该是, 只要一个变量是全局变量, 比如 defvar defcustom, 词法作用域都特殊处理, 简而言之, 全局变量永远是动态的.

1 个赞

总结的精辟!

有用 React/React Native Hooks 的伙伴吗?
useContext 就是 像Common Lisp 的 dynamic binding吧? (defparameter => let)