动态作用域用处一例

August 22, 2014

现在流行的是静态/词法作用域,现在新生的编程语言,只要不是玩具,那多半不会默认用动态作用域(因为静态的总比动态好)。

我用enh-ruby-mode写ruby代码,enh-ruby-mode有一个功能是自动在文件开头加上encoding文件头,不过我们都用ruby 2.1了,就没必要加了,所以我想把它关掉。我看了一下代码,果然是通过before-save-hook实现的,不过enh-ruby-mode没有提供关闭的选项,而那时候我又不知道remove-hook的存在。不过我知道elisp是动态作用域的,所以应该可以通过再定义一个同名的函数,“覆盖”原来的函数:

(add-hook 'enh-ruby-mode-hook
      (lambda ()
        (defun enh-ruby-mode-set-encoding())))

太邪恶了,所以后来我还是用remove-hook了。

我想能不能同过良好的设计来完全替代动态作用域呢?例如EMACS: The Extensible, Customizable Display Editor里的例子。