2012-12-12 33 views

回答

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) ...)的代码的“复杂宏”,因为底层语言本身不支持本地函数定义。

+0

我将此作为接受的答案切换,因为它更完整,并提供了完整的背景。 –

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)

+0

对我24.2.1返回“Symbol的函数定义是void:labels” –

+0

'(require'cl)'。如果您有足够的版本,请使用'(cl-labels ...)'代替。 – Hugh

+0

文档字符串说:“这就像'flet',除了绑定是词法”。这正是我想要的。谢谢! –