clojure.spec
Specification is much more powerful than static typing plus you also get validation, instrumentation and generative testing – clojure.spec (by Rich Hickey)
Example (spec for URIs)
1(ns example.specs
2 (:require #?(:clj [clojure.spec :as s]
3 :cljs [cljs.spec :as s])
4 [clojure.string :as str]))
5;; URI spec.
6(def uri?
7 (s/and string? #?(:clj #(try (do (java.net.URI. %) true) (catch Exception e false))
8 :cljs #(= (str/replace (js/encodeURI %) "%25" "%") %))))
9;; e.g. Call as follows:
10(s/valid? uri? "https://www.google.nl/url?q=https://www.reddit.com/r/Clojure/comments/4kutl7/clojurespec_guide/&sa=U&ved=0ahUKEwic2v3-r6DQAhVBGsAKHcrVCZMQFggUMAA&usg=AFQjCNHs0DmF1uNIw9BYUK7pqpgp5HEbow")
Videos
- Introducing clojure.spec (by Arne Brasseur);
- Agility & Robustness: Clojure spec (by Stuart Halloway);
- Clojure spec Screencast: Leverage (by Stuart Halloway);
- Clojure spec Screencast: Testing; (by Stuart Halloway)
- Clojure spec Screencast: Customizing Generators (by Stuart Halloway);
- Introduction to clojure.spec (by Lambda Island);
- clojure.spec (by David Nolen).