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)

なぜこうなった?fn私は、aの本体が暗黙的であることを理解して観察しました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 に答える