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 Can't create empty: user.Box user.Box (form-init8049111656025227309.clj:1)
user> (clojure.repl/pst *e)
UnsupportedOperationException Can't create empty: 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

我也遇到了这个问题。将记录符合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

但为什么一开始就需要创建空的记录呢?

这意味着在spec中无法检查记录集合吗?

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