Clojure Midje'提供'使用时'pcalls'

时间:2013-03-14 16:58:36

标签: clojure midje

我是Clojure的新手,我正在尝试将一些调用并行化为函数。

假设我的地图如下:

{:a 1 :b 2 :c 3}

我希望将键和值用作名为my-function的函数的参数,并为每个键/值对调用该函数。我可以使用doseq,如下所示:

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

然后我决定我希望对my-function的调用是并行的(在我的实际情况中,my-function将进行彼此独立的rest调用,所以我想并行执行它们)。我想出了以下内容:

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

这似乎按照我的预期工作(如果我错了或者有更好的方法,请纠正我)。我现在遇到的麻烦是让我的Midje测试通过。如果我使用上面的doseq版本,它们会正确传递。在我的测试中,我使用(提供....)来确保正确的调用,并且我希望使用它来检查对my-function的调用。是否有可能做到这一点?我发现很难在pcalls上找到很多信息。

由于

---------编辑---------

我设计了一个演示故障的例子。

可以找到here和测试here的实现。我发现单个测试运行正常,但多个测试会导致以下结果:

  

FAIL at(pcalls_unit.clj:29)这些电话不合适   次数:       (my-func 2 2)[预计至少一次,实际上从未被召唤]

     

FAIL“测试一些pcalls 3”(pcalls_unit.clj:26)       预期:无         实际:java.util.concurrent.ExecutionException:java.lang.Error:您好像已经创建了一个先决条件   pcalls-test.pcalls / my-func干扰了该函数的使用   Midje自己的代码。要修复,请定义您自己使用的功能   my-func,然后在提供的子句中描述该函数。

1 个答案:

答案 0 :(得分:1)

仅回答问题的第一部分pmap也可以用来写这个:

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