分享您的看法,请参加 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}} 来查找匹配的覆盖,而 {{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 投票
by
评论人: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 投票
by

评论人:jimrthy

我认为我可能遇到了这个问题,但似乎还有一些不确定性。

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

我非常长的描述可以在 https://groups.google.com/forum/#!topic/clojure/zPWPmQGm94w 中找到

我可以展示我尝试记录我所看到的具体情况的示例 https://gist.github.com/jimrthy/21851c52a8cd6b04a31ed08b1d0a7f04(当我写那个的时候,在 deftest 中似乎每次都运行。那不再是情况了)。

如果不是其他原因,最好有更明确的错误消息,它们包括它未能生成的规范名称。实际上,这通常会很有帮助,并且可能值得开设一个新的问题。请告诉我是否需要我创建一个。

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