【问题标题】:Lisp Anonymous Function Local VariableLisp 匿名函数局部变量
【发布时间】: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


    【解决方案1】:

    在 CL 中,您可以使用 fletlabels

    (defun do-stuff (n)
        (flet ((double (x) (* 2 x)))
          (double n)))
    
    (do-stuff 123) ;; = 246
    

    正如 Chris 所指出的,由于double 不是递归的,我们应该使用flet,因为两者之间的区别在于labels 可以处理递归函数。

    查看docs 了解有关labels 的信息,或查看this question 了解labelsflet 之间的区别。

    【讨论】:

    • 除非,在这种情况下,您可以(并且应该)使用flet 而不是labels,因为您的double 过程不是递归的。
    • @ChrisJester-Young 那不应该是编译时间(或其他什么),因为它是一个内置命令。来自 Mathematica,它在 2 之间没有区别
    • @William 在这种情况下,使用fletlabels 没有区别。主要区别在于您指的是正在定义的名称(double,在这种情况下):如果您使用 flet,任何对 double 的引用指的是在flet;而如果你使用labels,任何对double 的引用都是指你在此处定义的函数。
    • @William 为了让人们更容易阅读您的代码,最好保留使用 labels 用于真正定义递归函数的情况,这样当人们看到 labels ,他们会自动想到“递归函数”。
    猜你喜欢
    • 2015-02-26
    • 2016-05-28
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2013-10-04
    • 2011-10-29
    相关资源
    最近更新 更多