序列

spec 可以描述并与任意序列一起使用。它通过许多正则表达式规范操作支持这一点。

(clojure.spec/valid? (clojure.spec/cat :text string? :int int?) ["test" 1])
;;=> true

cat 需要用于描述序列的每个规范的标签。cat 描述了每个元素的序列和规范。

alt 用于在序列中的给定元素的多个可能规范中进行选择。例如:

(clojure.spec/valid? (clojure.spec/cat :text-or-int (clojure.spec/alt :text string? :int int?)) ["test"])
;;=> true

alt 还要求每个规范都用关键字标记。

正则表达式序列可以用一些非常有趣和强大的方式组成,以创建任意复杂的序列描述规范。这是一个稍微复杂的例子:

(clojure.spec/def ::complex-seq (clojure.spec/+ (clojure.spec/cat :num int? :foo-map (clojure.spec/map-of keyword? int?))))
(clojure.spec/valid? ::complex-seq [0 {:foo 3 :baz 1} 4 {:foo 4}])
;;=> true

这里::complex-seq 将验证一对或多对元素的序列,第一个是 int,第二个是关键字到 int 的映射。