我对defn的作用有点困惑.如果fn只生成匿名函数,我可以理解需要一个结合def和fn功能的构造,但是fn也可以创建命名函数.至少在repl中,我看不出这种用法与defn的区别.
当您提供名称符号时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)
正如你所看到的,我无法调用foo用fn它创建的函数,因为它没有绑定到Var.