请在Clojure 2024 状况调查中分享您的想法!

欢迎!请访问关于页面了解更多关于如何使用本站的信息。

0
test.check
我认为 {{clojure.core/for}} 的语法很适合与 test.check 的组合符号一起使用。例如:


(defn gen-even-subset
  "返回一个生成器,该生成器生成给定元素的偶数卡迪纳尔性子集"}
   [elements]
      (gen/for [bools (apply gen/tuple (repeat (count elements) gen/boolean))
                     :let [true-count (->> bools (filter identity) (count))]
                     :when (even? true-count)]}
    (->> (map list bools elements)
         
    
         
         


)

这结合了 {{fmap}}、{{bind}} 和 {{such-that}} 的功能,使用了熟悉的语法。


这里的一个缺点是,当多个生成器独立时,可能会倾向于使用多个子句,从而导致在 {{gen/tuple}} 简化且可能更容易缩小时,使用 {{gen/bind}}。针对此问题的一个方法是添加一个额外的支持子句,可能称为 {{:parallel}},它使用 {{:let}} 的语法来提供 {{gen/tuple}} 的功能。
(gen/for [:parallel [n1 gen/nat
                              n2 gen/nat]
          :let [sum (+ n1 n2)]]}


  {:nums [n1 n2] :sum sum})

与 {{gen/tuple}} 相比,这个方法的优势在于将生成器在语法上放置在名称旁边,而不是将生成器与名称隔离。

10 个答案

0
评论者:gfredericks

我认为关于 {{:when}} 的含义可能存在一些设计上的歧义。特别是,在以下人为设定的示例中


(for [n nat
      v (vec (return n))
      :let [sum (reduce + v)]
      :when (pos? sum)]
  v)


在我的默认设计中,这可能会导致死循环,原因与以下代码相同


(bind nat
      (fn [n]
        (such-that
          (fn [v] (pos? (reduce + v)))
          (vector (return n)))))


但是它也可以这样写


(such-that
  (fn [v] (pos? (reduce + v)))
  (bind nat (fn [n] (vector (return n)))))


因此问题在于是否仅将{{:when}}过滤器应用于上一个生成器,还是应用于所有上一个生成器。我有些模糊的感觉,认为后者在某些情况下可能效率更低,但我不确定具体是什么。所以我认为我们的选择是

决定始终以某种方式或另一种方式执行
提供第三个关键字({{:when-all}}?)以具有不同的行为
根本不写这个宏,因为它太难理解了

我的直觉是选择第一种方式,只将:when应用于上一个生成器。
0
by

评论者:gfredericks

附上我的初始草案。实现所需的思考比我预期的要多得多,因此我包含了一些内联注释来解释宏的结构。

0
by

评论者:gfredericks

附上TCHECK-15-p1.patch,更新为适用于当前master。

0
by

评论者:gfredericks

附上TCHECK-15-p2.patch,该patch在docstring中添加了关于独立子句、缩放和元组的注释。

0
by

评论者:gfredericks

附上TCHECK-15-p3.patch,该patch修复了一个关于命名空间别名中的一个错误和一个冗余。

0
by

评论者:gfredericks

附上TCHECK-15-p4.patch,该patch修复了一个解构错误(并添加了回归测试)。

0
by

评论者:gfredericks

还可能有助于注意,我目前已经将这个内容放在了我的 test.check 实用库中:https://github.com/fredericksgary/test.chuck#for

0
by

评论者:michaelblume

我想知道是否有可能通过分析代码,检查是否可以并行运行绑定来避免使用 :parallel 吗?

0
by

评论者:gfredericks

从理论上讲,这是可能的,但我们需要访问一个无错误的代码分析器。

另外,你可能会争论,这使得代码的意义更加微妙。

0
by
参考: https://clojure.atlassian.net/browse/TCHECK-15 (由 gfredericks 报告)
...