我认为 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)
filter first)
map second)
set))))
这结合了 {{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}} 相比,这个优点是将生成器的语法放在名称旁边,而不是将生成器从名称中分离出来。
{{:parallel}} 功能尚未添加到当前的补丁中。
请问