【发布时间】:2015-09-19 15:58:49
【问题描述】:
如何将匿名函数分配给 cl、emacs lisp 或 clojure 中的局部变量?
我尝试了以下但没有成功。
(let ((y (lambda (x) (* x x)) )) (y 2))
和
((lambda (x) 10) (lambda (y) (* y y)))
【问题讨论】:
标签: function clojure lisp common-lisp
如何将匿名函数分配给 cl、emacs lisp 或 clojure 中的局部变量?
我尝试了以下但没有成功。
(let ((y (lambda (x) (* x x)) )) (y 2))
和
((lambda (x) 10) (lambda (y) (* y y)))
【问题讨论】:
标签: function clojure lisp common-lisp
在 CL 中,您可以使用 flet 或 labels。
(defun do-stuff (n)
(flet ((double (x) (* 2 x)))
(double n)))
(do-stuff 123) ;; = 246
正如 Chris 所指出的,由于double 不是递归的,我们应该使用flet,因为两者之间的区别在于labels 可以处理递归函数。
查看docs 了解有关labels 的信息,或查看this question 了解labels 和flet 之间的区别。
【讨论】:
flet 而不是labels,因为您的double 过程不是递归的。
flet 或labels 没有区别。主要区别在于您指的是正在定义的名称(double,在这种情况下):如果您使用 flet,任何对 double 的引用指的是在flet;而如果你使用labels,任何对double 的引用都是指你在此处定义的函数。
labels 用于真正定义递归函数的情况,这样当人们看到 labels ,他们会自动想到“递归函数”。