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

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

+1 投票
规格
规格别名的生成器覆盖不被尊重。


(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


为原始规格提供生成器覆盖按预期工作


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

5 个答案

0 投票

评论由:alexmiller 制作

可能是因为别名的延迟缺失 - 另有一张具有相同原因的票。

0 投票

评论由:nwjsmith 制作

看起来可能是因为{{gensub}}在通过调用{{spec-name}}寻找匹配的覆盖时出了问题,它对于规格别名返回了错误值。

(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_作出

我有一个类似的问题。我认为这可能是相关的。
我正在尝试做的是:
{code:none}
(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 投票
参考:[CLJ-2079](https://clojure.atlassian.net/browse/CLJ-2079)(由 nwjsmith 报告)
...