【发布时间】:2012-07-26 11:14:36
【问题描述】:
为什么我们可以写作
(defn factory-foo [] (fn [] (println "foo")))
(apply (factory-foo) [])
但不是:
(defn factory-bar [] #((println "bar")))
(apply (factory-bar ) []) ;throws NPE
这是一个错误吗?
【问题讨论】:
为什么我们可以写作
(defn factory-foo [] (fn [] (println "foo")))
(apply (factory-foo) [])
但不是:
(defn factory-bar [] #((println "bar")))
(apply (factory-bar ) []) ;throws NPE
这是一个错误吗?
【问题讨论】:
#((println "bar)) 被读者翻译成(fn [] ((println "bar"))) - 注意额外的括号。 (println "bar") 这里打印bar 并返回nil,然后nil 本身由于外括号而被作为函数调用。 nil 实际上是 null,尝试取消引用它会导致 NPE。
为避免这种情况,只需在 #(..): #(println "bar") 内添加额外的括号。
【讨论】:
#(..) 表单。