2013-03-14 24 views
0

我對Clojure來說是新手,並且試圖將一些調用並行化爲一個函數。Clojure Midje'提供'當使用'pcalls'

比方說,我有一個圖如下:

{:a 1 :b 2 :c 3} 

,我想使用的鍵和值作爲函數的參數調用我的功能,以呼籲每個鍵/值對的功能。我可以如下使用doseq

(doseq [entry my-map] (my-function (key entry) (val entry))) 

我再決定我想我的函數的調用,以平行(在我的實際情況,我的功能將作休息調用它們是相互獨立的,並所以我想要並行)。我想出了以下情況:

(apply pcalls (map #(partial my-function (key %) (val %)) my-map)) 

這似乎爲我的預期運行(請糾正我,如果我錯了,或者有更好的方法)。我現在遇到的麻煩是讓我的Midje測試通過。如果我使用上面的doseq版本,它們會正確傳遞。在我的測試中,我使用(提供....)來確保正確的調用已經完成,並且我希望使用它來檢查對我的函數的調用。是否有可能做到這一點?我發現很難找到關於pcalls的很多信息。

感謝

--------- ---------編輯

我已經做作,演示功能衰竭的例子。

執行結果可以找到here,測試here。我發現,一個單一的測試運行正常,但多個測試會導致以下:

FAIL at (pcalls_unit.clj:29) These calls were not made the right number of times: (my-func 2 2) [expected at least once, actually never called]

FAIL "Test some pcalls 3" at (pcalls_unit.clj:26) Expected: nil Actual: java.util.concurrent.ExecutionException: java.lang.Error: You seem to have created a prerequisite for pcalls-test.pcalls/my-func that interferes with that function's use in Midje's own code. To fix, define a function of your own that uses my-func, then describe that function in a provided clause.

+0

是什麼你的測試看起來像?問題可能是Midje預計結果會按照某種順序出現。 – bdesham 2013-03-14 17:01:36

+0

嗨。我的測試看起來像: (實際上是 「測試的東西」 (方法 - 即通話-pcalls-的東西,和更多ARG1參數3)=> {:狀態200} (提供 (我的功能鍵1 VAL1 )=> some-result1 (my-function key2 val2)=> some-result2)) – SirSlush86 2013-03-14 17:44:52

+0

你能鏈接到失敗測試的要點嗎?請添加失敗輸出。 – 2013-03-15 01:59:22

回答

1

只回答這個問題pmap的第一部分也可以用來寫:

(doall (pmap my-function (keys my-map) (vals my-map)))