clojure.spec/and&clojure.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]