clojure.specand clojure.specor

clojure.spec/andclojure.spec/or 可用于创建更复杂的规范,使用多个规范或谓词:

(clojure.spec/def ::pos-odd (clojure.spec/and odd? pos?))

(clojure.spec/valid? ::pos-odd 1)
;;=> true

(clojure.spec/valid? ::pos-odd -3)
;;=> false

or 的作用相似,但有一个显着的不同。定义 or 规范时,必须使用关键字标记每个可能的分支。这用于提供错误消息中失败的特定分支:

(clojure.spec/def ::big-or-small (clojure.spec/or :small #(< % 10) :big #(> % 100)))

(clojure.spec/valid? ::big-or-small 1)
;;=> true

(clojure.spec/valid? ::big-or-small 150)
;;=> true

(clojure.spec/valid? ::big-or-small 20)
;;=> false

使用 or 符合规范时,将返回适用的规范,使值符合:

(clojure.spec/conform ::big-or-small 5)
;; => [:small 5]