4

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

4

2 回答 2

4

在 Emacs<24.3 中,您可以(require 'cl)然后使用labels. 在 Emacs-24.3 及更高版本中,您还可以执行(require 'cl-lib)然后使用cl-fletor cl-labels

所有这些都是“复杂的宏”,它们生成的代码看起来像(let ((fun (lambda (args) (body)))) ... (funcall fun my-args) ...),因为底层语言本身并不支持本地函数定义。

于 2012-12-13T01:36:21.817 回答
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)

于 2012-12-12T22:11:39.657 回答