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
评论由: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 运行似乎每次都会失败。在内联定义中运行似乎更可靠)。

我的长篇大论描述在 https://groups.google.com/forum/#!topic/clojure/zPWPmQGm94w

我尝试记录下我看到的现象的样本在 https://gist.github.com/jimrthy/21851c52a8cd6b04a31ed08b1d0a7f04(当我写这个时,在内联定义中每次都工作。现在不是这种情况)。

至少,如果有更好的错误消息将包括它失败生成的规范名称那就太好了。这通常是有帮助的,可能值得单独的工单。请告诉我是否需要我创建一个。

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