Sak*_*ake 10 lisp emacs elisp common-lisp dynamic-scope
我现在正在从参考手册和LISP Book中的Common Lisp 学习Emacs Lisp .
来自Common Lisp的书
>> (setf power-of-two
(let ((previous-power-of-two 1))
#'(lambda ()
(setf previous-power-of-two
(* previous-power-of-two 2)))))
>> (funcall power-of-two)
2
>> (funcall power-of-two)
4
>> (funcall power-of-two)
8
Run Code Online (Sandbox Code Playgroud)
由于其动态绑定行为,该函数在Emacs Lisp中不起作用.
我想知道是否可以在不引入全局变量的情况下在Emacs Lisp中实现相同的功能?
dan*_*lei 17
更新:
到目前为止,Emacs 24已经正式发布lexical-let,当缓冲区局部变量lexical-binding为非零时,它支持词法绑定而不使用.另见M-: (info "(elisp) using lexical binding")和pokita的回答.
您可以使用lexical-let从Common Lisp的扩展(以下简称"CL包"):
elisp> (require 'cl)
cl
elisp> (setf power-of-two
(lexical-let ((previous-power-of-two 1))
#'(lambda ()
(setf previous-power-of-two
(* previous-power-of-two 2)))))
(lambda
(&rest --cl-rest--)
(apply
(lambda
(G175638)
(set G175638
(*
(symbol-value G175638)
2)))
'--previous-power-of-two-- --cl-rest--))
elisp> (funcall power-of-two)
2
elisp> (funcall power-of-two)
4
elisp> (funcall power-of-two)
8
Run Code Online (Sandbox Code Playgroud)
我也听说过GNU Emacs的lexbind分支.
pok*_*ita 12
来自bzr的Emacs24现在支持开箱即用的词法绑定; 它只是默认情况下没有被激活,因为有许多软件包仍然故意或无意中依赖于动态范围.您的上述代码应该在Emacs24中在缓冲区中正常工作,其中变量'lexical-binding'设置为't'.