我正在学习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
。
答案 0 :(得分:8)
匿名fn
文字#()
没有隐含的do
。
答案 1 :(得分:2)
您在2个parens中有println
,因此会评估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
。