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

欢迎!请参见关于页面以了解更多关于如何工作的信息。

+1
规范
生成器覆盖在多规范上没有按预期工作。
以下代码展示了这个问题。

{code:none}
(s/def ::obj-type #{:a :b})

(s/def ::base-obj (s/keys :req [::obj-type]))

(defmulti obj-type ::obj-type)
(defmethod obj-type :a [_]
  ::base-obj)
(defmethod obj-type :b [_]
  ::base-obj)

(s/def ::obj (s/multi-spec obj-type ::obj-type))


{code:none}
(gen/sample (s/gen ::obj {::obj-type #(gen/return :a)}))

在上面的例子中,为多方法的多播函数*::obj-type*提供了一个生成器覆盖。
预期只会返回*{::obj-type :a}*集合。
实际上它也会返回*{::obj-type :b}*。
也就是说,生成器不能用来约束要采样的调度键集合。

h2. 当前方法
在多方法的情况下,为每个可能的调度值构建一个生成器。
然后随机选择一个,而不关注调度函数(键)的覆盖。

h2. 修补方法
提交可用[这里|https://github.com/bonega/spec.alpha/commit/9cb42478b52eac275d496ec29669e2bf4b3e8e1f]
修补版本按照与原始版本完全相同的方式构建调度值的生成器。
之后,检查是否存在对调度函数的覆盖。
如果有,则使用覆盖生成器执行gen/bind。
bind函数从覆盖生成器生成一个值。
然后使用该值查找并返回正确的多方法生成器。

[测试案例|https://pastebin.com/62ZT5Zfc]

6个答案

0

评论由:bonega

为问题提供了修补程序。

0
by

评论者:alexmiller

请将问题的代码移到描述中,并解释问题和变更?

0
by
_评论者:[email protected]_

我弄不懂如何编辑描述...

描述
在多方法的情况下,为每个可能的调度值构建一个生成器。
然后随机选择一个,而不考虑对 dispatch-fn(key) 的覆盖。

提交: https://github.com/bonega/spec.alpha/commit/9cb42478b52eac275d496ec29669e2bf4b3e8e1f
我的补丁可能会通过检查是否存在对 dispatch-fn 的覆盖来修复它。
如果是这样,则对覆盖生成器执行 gen/bind,并使用结果查找正确的多方法生成器。

测试用例: https://pastebin.com/62ZT5Zfc
预期测试通过。
基本上,我想使用类似于 `(gen/generate (s/gen ::obj {::obj-type #(gen/return :a)})` 的覆盖生成器生成 ::obj。
预期结果应该是 `{::obj-type :a}`。
在此之前,即使指定了覆盖,输出也可以是 :b。
0
by

评论者:alexmiller

我已经为您提供了对票证的编辑权限,因此您可以进行更新...

0
by

评论者:[email protected]

我已更新了描述。
请告诉我是否有任何不清楚的地方。

0
by
...