9

レイジー seq を受け取り、未実現のレイジー seq を返す関数があります。ここで、結果が未実現の遅延シーケンスであることを確認するために、単体テストを (test-is btw で) 書きたいと思います。

4

2 に答える 2

9
user=> (instance? clojure.lang.LazySeq (map + [1 2 3 4] [1 2 3 4]))
true

テストすることがたくさんある場合、おそらくこれはそれを単純化するでしょう:

(defmacro is-lazy? [x] `(is (instance? clojure.lang.LazySeq ~x)))

user=> (is-lazy? 1)

FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:7)
expected: (clojure.core/instance? clojure.lang.LazySeq 1)
  actual: (not (clojure.core/instance? clojure.lang.LazySeq 1))
false
user=> (is-lazy? (map + [1 2 3 4] [1 2 3 4]))
true

realized?Clojure 1.3以降、「promise、delay、future、またはlazyシーケンスの値が生成された場合にtrueを返す」という関数もあります。

于 2009-11-01T05:55:49.927 に答える
6

テスト ケースのシーケンス ジェネレーター関数として、副作用のある関数 (ref への書き込みなど) を使用します。副作用が発生しない場合は、シーケンスが実現されないままであることを意味します...シーケンスが実現されるとすぐに、関数が呼び出されます。

まず、次のように設定します。

(def effect-count (ref 0))

(defn test-fn [x]
    (do
        (dosync (alter effect-count inc))
        x))

次に、関数を実行します。ここでは、マップを使用します。

(def result (map test-fn (range 1 10)))

test-fn が実行されたかどうかをテストします。

(if (= 0 @effect-count) 
    (println "Test passed!")
    (println "Test failed!"))

map が遅延していることはわかっているので、この時点では常に機能するはずです。次に、シーケンスの評価を強制します。

(dorun result)

effect-count の値を再度確認します。今回は、副作用が引き起こされると予想しています。そして、それはとても...

user=>@effect-count
9
于 2009-10-31T16:57:59.023 に答える