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 内运行似乎每次都有效。但这并不成立)。

如果别的都不行,最好能有更好的错误信息,包括它尝试生成失败的规范名称。这通常很有用,也可能值得开一个单独的工单。请告知我是否需要创建一个。

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