在普通的 lisp 中命名为 lambda

Named lambda in common lisp

我需要写一个递归辅助函数,不需要给它全局作用域,但我需要引用它来实现递归。

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

malisper 说的。

或者如果你真的需要一个命名的 lambda:

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

我刚刚发现这是一个很常见的成语,可以出现在 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))