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

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

+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

可能是在别名情况下缺少了延迟 - 有另一个与此原因相同的工单。

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_

我有一个类似的问题。我认为这与之相关。
我正在尝试做一些类似的事情
{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

我认为我可能遇到了这个问题,但似乎有些随机性 involved。

它的行为似乎不同,取决于我是从 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 报告)
...