2015-01-17 13 views
2

我需要编写一个递归辅助函数,并且不需要给它全局范围,但我需要引用它来实现递归。在通用lisp中命名lambda

Emacs lisp有fset,它分配给符号的函数单元。通用lisp中的等价物是什么?

+0

我可以lambda函数赋值给一个符号,然后'(funcall)'这个符号,但必须有一个更漂亮的方式。 – erjoalgo

+4

看看标签:http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/speope_fletcm_scm_macrolet.html – malisper

回答

2

我才发现,这是很常见是在alexandria一个idion。从亚历山大代码:

(defmacro named-lambda (name lambda-list &body body) 
    "Expands into a lambda-expression within whose BODY NAME denotes the corresponding function." 
    `(labels ((,name ,lambda-list ,@body)) 
#',name)) 

下面是一个使用〔实施例:

(let ((! ;; Everything can be a symbol :D 
    ;; Definition here 
    (named-lambda self (n) 
     (case n 
      (1 1) 
      (otherwise (* n 
       (self (1- n)))))))) ;; Recurse here 
    ;; How to call it 
    (funcall ! 6)) 
+0

P.S.我只是想为拉尔斯布林霍夫的回答添加一个例子。 – fstamour

1

什么malisper说。

或者,如果你真的需要一个名为拉姆达:

(defmacro named-lambda (name args &body body) 
    `(labels ((,name ,args ,@body)) 
    #',name))