请在 2024年Clojure状态调查! 分享您的想法。

欢迎!请查阅《关于》页面以了解更多关于该机制的信息。

+1 投票
Spec

`
user> (require '[clojure.spec :as s])
nil
user> (defrecord Box [a])
user.Box
user>
user> (s/conform

    (s/cat :boxes (s/* #(instance? Box %))
           :name (s/coll-of integer?))
    [(Box. 0) [5]])

UnsupportedOperationException 无法创建:user.Box user.Box (form-init8049111656025227309.clj:1)
user> (clojure.repl/pst *e)
UnsupportedOperationException 无法创建:user.Box

   	user.Box (NO_SOURCE_FILE:2)
clojure.core/empty (core.clj:5151)
clojure.spec/every-impl/cfns--14008/fn--14014 (spec.clj:1215)
clojure.spec/every-impl/reify--14027 (spec.clj:1229)
clojure.spec/conform (spec.clj:150)
clojure.spec/dt (spec.clj:731)
clojure.spec/dt (spec.clj:727)
clojure.spec/deriv (spec.clj:1456)
clojure.spec/deriv (spec.clj:1463)
clojure.spec/deriv (spec.clj:1467)
clojure.spec/re-conform (spec.clj:1589)
clojure.spec/regex-spec-impl/reify--14267 (spec.clj:1633)

`

这是从 -alpha7 中的一个回归;相同类型的 spec(除 coll-of 的默认值参数外)在那里正常工作。

4 个答案

+1 投票

评论者:oakes

我遇到了这个问题。将 record 符合 coll-of spec 应该显示正常 spec 错误,而不是从 spec 实现的深处抛出。

0 投票
_评论者:alexmiller_

在这种情况下,它将 s/* 视为不匹配,然后匹配 (Box. 0) 到 (s/coll-of integer?)。这匹配了初始谓词 (coll?),但是跳转到 :else 情况,该情况假定可以调用 `empty`。

您可以通过向 coll-of 添加 :kind 谓词来解决这个问题


(s/conform
        ;(s/cat :boxes (s/* #(instance? Box %))
             :name (s/coll-of integer? :kind #(not (record? %))))
        [(Box. 0) [5]])
;;=> {:boxes [#user.Box{:a 0}], :name [5]}
0 投票

评论由:interstar 提供的

但为什么一开始就需要清空呢?

这表示你无法在规格中检查记录集合吗?

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