我现在正在学习 Emacs Lisp参考手册 http://www.gnu.org/software/emacs/manual/elisp.html和 Common Lisp 来自LISP https://rads.stackoverflow.com/amzn/click/com/0201083191 Book.
来自 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
由于其动态绑定行为,该函数无法在 Emacs Lisp 中运行。
我想知道是否可以在 Emacs Lisp 中实现相同的功能而不引入全局变量?
Update:
至此,Emacs 24已经正式发布,并且支持词法绑定,无需使用lexical-let
,当缓冲区局部变量lexical-binding
是非零的。也可以看看M-: (info "(elisp) using lexical binding")
以及波基塔的回答。
您可以使用lexical-let
来自Common Lisp 扩展 http://www.gnu.org/software/emacs/manual/html_mono/cl.html(“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
我还听说过 GNU Emacs 的 lexbind 分支。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)