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

欢迎!请参阅关于页面以获取更多关于如何工作的信息。

+1
Spec
生成器覆盖在多特派上无法按预期工作。
下面的代码示例说明了问题。

{代码:无}
(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)))


{代码:无}
(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

评论者:alexmiller

您能将问题的代码移到描述中,并解释问题和更改吗?

0
_评论者:[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

评论者:alexmiller

我已经为您开启了票据的编辑权限,以便您可以进行更新...

0

评论者:[email protected]

我已经更新了描述。
如果有什么不清楚的地方,请告诉我。

0
...