我需要编写一个递归帮助函数,并且不需要为其分配全局范围,但是我需要引用它来实现递归。
Emacs Lisp 中有 `fset` 函数,可以将函数分配给符号的函数单元。那么,在 Common Lisp 中,有什么等效的方法呢?
Emacs Lisp 中有 `fset` 函数,可以将函数分配给符号的函数单元。那么,在 Common Lisp 中,有什么等效的方法呢?
我刚刚发现这是一个很常见的习语,甚至在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))
以下是malisper所说的内容。
或者,如果您确实需要一个命名的lambda:
(defmacro named-lambda (name args &body body)
`(labels ((,name ,args ,@body))
#',name))
(funcall )
该符号,但一定有更好的方法。 - ealfonso