高阶函数和简短形式

Sta*_*lin 0 macros function clojure

为什么我们可以写

 (defn factory-foo [] (fn [] (println "foo")))
 (apply (factory-foo) [])
Run Code Online (Sandbox Code Playgroud)

但不是:

 (defn factory-bar [] #((println "bar")))
 (apply (factory-bar ) []) ;throws NPE
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?

Vla*_*eev 7

#((println "bar))由读者翻译(fn [] ((println "bar")))- 注意额外的括号.(println "bar")这里打印bar并返回nil,然后nil由于外括号而将其自身称为函数.nilnull在事实上,并试图取消对它的引用结果NPE.

为了避免这种情况,只需将额外的一对括号放入其中#(..):#(println "bar").