在Clojure中定义的目的

pla*_*ian 4 clojure

我对defn的作用有点困惑.如果fn只生成匿名函数,我可以理解需要一个结合def和fn功能的构造,但是fn也可以创建命名函数.至少在repl中,我看不出这种用法与defn的区别.

slo*_*oth 6

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

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

(def somename 
    (fn ...body...
Run Code Online (Sandbox Code Playgroud)

defn这只是一个捷径.

(defn somename 
    ...body...
Run Code Online (Sandbox Code Playgroud)

回复你的评论,来自一个新的代表:

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
>  
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我无法调用foofn它创建的函数,因为它没有绑定到Var.

  • 也许这个名字已经有了Var?你试过重置你的repl吗?我无法重现您描述的行为. (2认同)