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