最新版本的Emacs支持elisp代码中变量的词法绑定。是否也可以通过词汇重新定义函数?换句话说,Emacs Lisp有类似lexical-flet
的东西吗?
答案 0 :(得分:4)
在Emacs< 24.3中,您可以(require 'cl)
然后使用labels
。在Emacs-24.3及更高版本中,您还可以执行(require 'cl-lib)
,然后使用cl-flet
或cl-labels
。
所有这些都是“复杂的宏”,它们生成的代码看起来像(let ((fun (lambda (args) (body)))) ... (funcall fun my-args) ...)
,因为基础语言本身不支持本地函数定义。
答案 1 :(得分:2)
有labels
,但我不知道这是否是你要找的:
(defun foo ()
42)
(defun bar ()
(foo))
(list
(foo)
(bar)
(labels ((foo ()
12))
(list (foo)
(bar)))
(foo)
(bar))
返回(42 42 (12 42) 42 42)
。