在Clojure中定义的目的

我对defn的角色有点困惑。 如果fn只产生匿名函数,我可以理解需要一个结合了def和fn功能的构造,但是fn也可以创建命名函数。 至少在repl中,我没有看到这个用法与defn不同。


当您为fn提供名称符号时,它只会在函数定义内绑定到函数对象本身。 这是为了允许匿名函数自己调用(Clojure - 特殊形式)。

因此,要创建一个功能fn绑定到全局访问的名称,您必须使用

(def somename 
    (fn ...body...

defn只是这个的一个捷径。

(defn somename 
    ...body...

回应你的评论,来自一个新鲜的报告:

Give me some Clojure:
> (fn foo [] (+ 1 3))
#<sandbox31764$eval31779$foo__31780 sandbox31764$eval31779$foo__31780@12eae8eb>
> (foo)
java.lang.RuntimeException: Unable to resolve symbol: foo in this context
> (defn foo [] (+ 1 3))
#'sandbox31764/foo
> (foo)
4
>  

正如你所看到的,我不能调用用fn创建的foo函数,因为它没有绑定到Var。


主要区别在于defn创建了一个全局名称,而fn只创建一个全局名称。 全局名称也是var,因为它最终是用def创建的。 您可以给匿名函数的名称不是一个var,并且只在该函数的范围内。 这主要是因为函数可以是递归的。

链接地址: http://www.djcxy.com/p/82569.html

上一篇: purpose of defn in Clojure

下一篇: , public/private, defaults