emacs lisp是否支持词法重新定义函数?

时间:2012-12-12 21:16:24

标签: function emacs elisp lexical-scope

最新版本的Emacs支持elisp代码中变量的词法绑定。是否也可以通过词汇重新定义函数?换句话说,Emacs Lisp有类似lexical-flet的东西吗?

2 个答案:

答案 0 :(得分:4)

在Emacs< 24.3中,您可以(require 'cl)然后使用labels。在Emacs-24.3及更高版本中,您还可以执行(require 'cl-lib),然后使用cl-fletcl-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)