为什么我们使用 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)
在您的第一个示例中:最后一个语句是函数的返回值。的返回值println是nil。因此,您会看到两个打印件,然后从您的 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)