为什么这个以println开头的匿名函数会导致NullPointerException?

时间:2012-09-21 16:18:47

标签: clojure

我正在学习pmap并编写了以下函数:

(pmap #((println "hello from " (-> (Thread/currentThread) .getName)) 
         (+ %1 %2)) 
   [1 1 1] [-1 -1 -1])

运行时,结果为NullPointerException

(hello from  clojure-agent-send-off-pool-4
hello from  clojure-agent-send-off-pool-3
hello from  clojure-agent-send-off-pool-5
NullPointerException   user/eval55/fn--56 (NO_SOURCE_FILE:11)

为什么会这样?我理解并观察到fn的主体是隐式的do

2 个答案:

答案 0 :(得分:8)

匿名fn文字#()没有隐含的do

答案 1 :(得分:2)

您在2个parens中有println,因此会评估println的结果。 println总是返回nil,因此返回NullPointerException。

尝试从#()

中删除多余的parens
   (pmap #(println "hello from " 
         (-> (Thread/currentThread) .getName) 
         (+ %1 %2)) 
          [1 1 1] [-1 -1 -1] )

编辑:

然后您将需要其他评论中提到的do,如:

(pmap #(do (println "hello from " 
     (-> (Thread/currentThread) .getName)) 
     (+ %1 %2)) 
      [1 1 1] [-1 -1 -1] )

do阅读器宏中#()所需的原因并不是函数不包含隐式do,而是与宏扩展的方式有关。基本上,该宏采用单一形式,因此需要明确的do