2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多关于此的信息。

0 投票
test.check

有许多生成器返回一个序列(列表、向量、元组、映射、字符串等)。有时在生成的序列上设置大小限制(最小或最大)非常有用。有一个接受序列生成器并确保生成的序列具有特定长度的生成器将会很不错。以下是三个示例:
(of-length min max gen)
(of-max-length max gen) => (of-length 0 max gen)
(of-min-length min gen) => (of-length min nil gen)

of-length 检查生成序列的长度。如果它太短,则使用 (take min (cycle s)) 来扩展序列的长度。
如果过长,则使用 (take max s) 来返回最大长度。
需要小心返回与接收到的相同类型。
如果不接收序列,将其视为单元素序列。
如果 min 不是 0,则使用 such-that not nil 确保生成正确的 seq。

22 个答案

0 投票

评论者:gfredericks

大多数集合生成器已经可以接受控制其大小的选项;您是否有考虑这种情况,其中这些控制还不够用?

0 投票

评论者:m0smith

我完全错过了那些接受 :min 和 :max 选项的。

0 投票

评论者:m0smith

0 投票
评论由:gfredericks_ 提出













0 投票

评论者:m0smith

您更倾向于哪种?添加类似于of-length的函数来限制现有的序列生成器,还是创建(def string ...)和(defn string* ...)?我刚刚完成了TCHECK-97的Unicode实现,所以我将遵循我们决定的任何模式。

0 投票
by

评论者:gfredericks

我们不是至少有三个字符串生成器吗?您是不是在考虑为每个生成器都有备选方案?

0 投票
by
评论者:m0smith_

我提出这个请求的真实想法。我们真想将字符串生成器的数量翻倍吗?更不用说还有数组等其他事情。

另一个想法是新增一个单一的生成器,to-string,可以接受不同的字符生成器,并使用它根据元素生成器来生成字符串


 (defn to-string
   ([element-gen] (to-string element-gen {})))
   ([element-gen [{:keys [num-elements min-elements max-elements max-tries ] :or {num-elements nil min-elements 0 max-elements nil max-retries 10}}]
                   (fmap clojure.string/join (vector char-gen ==apply-options==))))


我省略了处理选项的代码,但希望您能理解这个想法。

它可以这样使用: (to-string char {:min-elements 5 :max-elements 10})  或者 (to-string char-ascii {:num-elements 5})

这样就有可能添加新的字符生成器,这些生成器可以很容易地转换成字符串。
0 投票
by
评论者:m0smith_

看起来,coll-distinct-by 几乎可以做到我需要的所有事情,但是allow-dups?标志没有按我预期的操作。

(sample (coll-distinct-by [] identity true  false (elements [\a \b \c \d \e ]) {:num-elements 4}))即使在allow-dups?为true的情况下也总是返回不同的元素
0 投票
by

评论者:gfredericks

{{coll-distinct-by}} 非常专业,可能在这里不太相关。

我觉得你可以很容易地将《link: num-elements min-elements max-elements》翻译成由《gen/vector》接受的参数。`max-retries`不应该适用。

类似trans-to-string这样的(to-string)可能很好,特别是如果它与您为TCHECK-97(例如,TCHECK-97为trans-to-string提供参数)所考虑的事情相匹配。

0 投票

评论者:m0smith

使用git --no-pager diff master feature/TCHECK-99生成的修复程序,在https://github.com/m0smith/test.check.git

0 投票

评论者:m0smith

忽略那个修复程序。我主分支的版本已经过时。新的修复程序在路上

0 投票

评论者:m0smith

TCHECK-99-2.patch是在同步test.check与我分支后生成的。应该是最新的。

0 投票
评论者:m0smith_

我还想到了如何让一个函数表现得像一个生成器。给一个函数添加:generator-factory元数据,例如:

(defn to-string
“生成element-gen字符串,默认为字符”
{:generator-factory to-string}
([] (to-string char {})))
   ([element-gen] (to-string element-gen {})))
([element-gen [{:keys [num-elements min-elements max-elements]}]
                   (fmap clojure.string/join (vector char-gen ==apply-options==))))


生成器的?可以被更新为接受具有:generator-factory元数据的任何东西
call-gen可以更新为查找新元数据,如果存在,则调用相关函数并使用结果作为生成器

0 投票

评论者:gfredericks

是的,这基本上是我保留向后兼容性的思路——元数据生成器将以某种方式附加某些过时警告。

0 投票
评论者:m0smith_

此外,在to-string中,clojure.string/join支持分隔符,可以轻松地作为附加选项添加:

(to-string int {:sep ","})

如果您同意,我将更新该修复程序。
...