匿名函数:不同的语法奇怪的行为

Eri*_*ura 0 clojure

为什么我们使用 fn 和 NullPointerException 使用 # ??

Clojure 1.8.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_91-b14

> ((fn [x] (println x) (println x)) "I have a question")
I have a question
I have a question
=> nil

> (#((println %) (println %)) "I have a question")
I have a question
I have a question
NullPointerException   user/eval1155/fn--1156 (form-init5537026255318038171.clj:1)
Run Code Online (Sandbox Code Playgroud)

cfr*_*ick 7

在您的第一个示例中:最后一个语句是函数的返回值。的返回值printlnnil。因此,您会看到两个打印件,然后从您的 REPL 中返回nil. 请参阅下面的标记,它发生的位置(想象return在命令式语言中看到的隐式):

> ((fn [x] (println x) (println x)) "I have a question")
                       ^~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

您的第二个示例:直接调用匿名函数的主体。您应该do在 anon fn 内添加一个。否则(如您的示例),这将使用第一次打印的结果作为调用的函数;do在标记处添加:

> (#((println %) (println %)) "I have a question")
     ^
Run Code Online (Sandbox Code Playgroud)

如果您在阅读器施展魔法后检查结果代码,您可以看到这一展开(再次参见标记):

user=> '(#((println %) (println %)) "I have a question")
((fn* [p1__8265#] ((println p1__8265#) (println p1__8265#))) "I have a question")
                   ^
Run Code Online (Sandbox Code Playgroud)