高阶函数和简短形式

时间:2012-07-26 11:14:36

标签: function macros clojure

为什么我们可以写

 (defn factory-foo [] (fn [] (println "foo")))
 (apply (factory-foo) [])

但不是:

 (defn factory-bar [] #((println "bar")))
 (apply (factory-bar ) []) ;throws NPE

这是一个错误吗?

1 个答案:

答案 0 :(得分:7)

#((println "bar))由读者翻译为(fn [] ((println "bar"))) - 请注意额外的括号。 (println "bar")此处打印bar并返回nil,然后由于外括号而将nil本身作为函数调用。 nil实际上是null,并试图将其解除引用至NPE。

要避免这种情况,只需在#(..) #(println "bar")内删除额外的一对括号。