分享您的想法,点击Clojure 2024调查问卷!

欢迎!请查看关于页面,了解该功能的工作原理。

+1
Spec
Spec别名生成器覆盖不被尊重。


(require '[clojure.spec :as s])
(require '[clojure.spec.gen :as gen])
(s/def ::original number?)
(s/def ::alias ::original)

(every? double? (gen/sample (s/gen ::alias {::alias gen/double})))
;; => false


为原始spec提供生成器覆盖时,表现符合预期


(every? double? (gen/sample (s/gen ::alias {::original gen/double})))
;; => true

5 个答案

0

评论人:alexmiller

可能是在alias情况下遗漏了延迟 - 另有一个与该原因相同的ticket。

0

评论人:nwjsmith

看起来可能是由于{{gensub}}通过调用{{spec-name}}查找匹配的覆盖,而{{spec-name}}为spec别名返回错误的值。

(require '[clojure.spec :as s]) (s/def ::original number?) (s/def ::alias ::original) (@#'clojure.spec/spec-name (s/get-spec ::alias)) ;; => :user/original

0
_评论人:charleshd_

我遇到了一个类似的问题。我认为这与此相关。
我正在尝试做以下事情
{代码:无}
(require '[clojure.spec.alpha :as s])
(require '[clojure.spec.gen.alpha :as gen])
(s/def ::bar any?)
(s/def ::foo (s/with-gen any? (fn [] (s/gen ::bar))))
(gen/generate (s/gen ::foo {::bar (fn [] (s/gen int?))}))

我原本期望它生成一个整数,就像直接在 ::foo 定义中对 ::bar 进行别名一样。但它没有,并且保持了 with-gen 绑定的生成器。
这是否是同一个问题,或者这是预期行为,我应该提交一个新的问题吗?
0

评论者:jimrthy

我认为我可能遇到了这个问题,除了涉及一些不确定性。

它的表现似乎不同,取决于我是从 deftest 还是 REPL 中运行它。 (从 REPL 中运行似乎每次都会失败。在 deftest 中运行似乎更可靠)。

我详尽的描述在 https://groups.google.com/forum/#!topic/clojure/zPWPmQGm94w

我尝试记录看到的情况的示例在 https://gist.github.com/jimrthy/21851c52a8cd6b04a31ed08b1d0a7f04 (当我写那个的时候,在 deftest 中似乎每次都会工作。这不是情况)。

至少,如果其他都不行,能有一个更好的错误消息那将很好,该错误消息包含它无法生成的 spec 名称。这通常会很有用,也许可以单独开一个条目。请告诉我你是否希望我创建一个。

0
参考:https://clojure.atlassian.net/browse/CLJ-2079 (由 nwjsmith 报告)
...