6

我正在学习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)

为什么会这样?我已经理解并观察到 ​​a 的主体fn是一个隐含的do

4

2 回答 2

8

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

于 2012-09-21T16:21:39.417 回答
2

您有println2 个括号,因此对结果进行了println评估。 println总是返回 nil,因此返回 NullPointerException。

尝试从以下内容中删除多余的括号#()

   (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.

于 2012-09-21T19:35:47.183 回答