3

私のアプリケーションは、clojurereplまたはleiningenreplを使用して実行すると実行されますが、uberjarを使用してjarを作成してアプリケーションを実行すると、コレクションの最初の2つのレコードのみが読み取られます。

私はそれをpmapまで追跡したので、pmapの可能な限り単純な使用法を作成しましたが、それはより奇妙になります。なぜこれが機能するのですか

(ns ktest.core
    (:gen-class))
(defn -main []
  (println (pmap identity (range 20))))

しかし、これではありません

(ns ktest.core
        (:gen-class))
    (defn -main []
       (pmap #(println %) (range 20)))
4

1 に答える 1

4

あなたは「怠惰なバグ」に噛まれてきました。pmapは、読み取られたときに結果を計算するシーケンスを作成します。これをで実行するとprintln、結果が読み取られて印刷できるため、評価がトリガーされます。この場合、この意志doallまたはを修正することができますdorun。それを実行することの印刷の副作用だけが必要な場合は、を選択します。dorunこの結果で何かを行う必要がある場合doallは、結果をメモリに保持するものを選択します。

(dorun (pmap #(println %) (range 20)))

シーケンスがチャンク化されているため、いくつかのアイテムが印刷されます。pmapとチャンクシーケンスの詳細については、このJiraの問題を参照してください。

于 2012-10-16T23:46:12.037 に答える