Изменения в новых версиях / Clojure 1.9

;; *** in version 1.9: ***
(require '[clojure.spec.alpha :as s])

(s/def ::age (s/and int? #(>= % 0)))
(s/def ::name string?)
(s/def ::person (s/keys :req [::name ::age]))

(s/valid? ::person {::name "Ada" ::age 30})
;=> true

(s/explain ::person {::name "Ada" ::age -1})
;; -1 - failed: (>= % 0) at [:age] spec: :user/age

;; specs can also check a function's args and return value
(defn add [a b] (+ a b))
(s/fdef add :args (s/cat :a int? :b int?) :ret int?)