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