在普通的 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))
我需要写一个递归辅助函数,不需要给它全局作用域,但我需要引用它来实现递归。
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))