序列

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 的對映。