Common Lisp中的命名lambda函数

3
我需要编写一个递归帮助函数,并且不需要为其分配全局范围,但是我需要引用它来实现递归。
Emacs Lisp 中有 `fset` 函数,可以将函数分配给符号的函数单元。那么,在 Common Lisp 中,有什么等效的方法呢?

我可以将一个lambda函数分配给一个符号,然后(funcall )该符号,但一定有更好的方法。 - ealfonso
5
查看标签:http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/speope_fletcm_scm_macrolet.html - malisper
2个回答

3

我刚刚发现这是一个很常见的习语,甚至在alexandria中也有相关内容。以下是alexandria代码:

(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))

PS:我只是想为Lars Brinkhoff的回答添加一个例子。 - fstamour

2

以下是malisper所说的内容。

或者,如果您确实需要一个命名的lambda:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接