我认为{{clojure.core/for}}的语法与test.check的组合器非常契合。例如:
(defn gen-even-subset
"返回一个生成器,该生成器生成交替基数
给定元素的子集"
[元素]
(gen/for [布尔值 (apply gen/tuple (重复(元素计数) gen/boolean))
:let [true-count (->> 布尔值 (过滤真实身份) (大小)]]
:when (even? true-count)]
(->> (map列表 布尔值 元素)
(过滤器第一)
(映射第二)
)))
这结合了{{fmap}}、{{bind}}和{{such-that}}的能力,采用了熟悉的语法。
这里的一个缺点是使用多个子句用于独立的生成器会诱使使用{{gen/bind}},而似乎{{gen/tuple}}会更简单且更容易缩小。针对这种方法的解决方案是添加一个额外的受支持的子句,可能称为{{:parallel}},它使用{{:let}}的语法来提供{{gen/tuple}}的功能
(gen/for [:parallel [n1 gen/nat
(({gen/nat}
:let [sum (+ n1 n2)]]
{:nums [n1 n2] :sum sum})
与{{gen/tuple}}相比,这种方法的优势在于将生成器在语法上放置在名称旁边,而不是将生成器与名称分开。
当前补丁中没有添加{{:parallel}}功能。