anchor.diff:  (s/conform ::vnum3 [1 2 3])
   ;;=> #{1 2 3}
   (s/explain ::vnum3 #{1 2 3})   ;; not a vector
  -;; val: #{1 3 2} fails spec: ::vnum3 predicate: clojure.core/vector?
  +;; #{1 3 2} - failed: vector? spec: :user/vnum3
   (s/explain ::vnum3 [1 1 1])    ;; not distinct
  -;; val: [1 1 1] fails spec: ::vnum3 predicate: distinct?
  +;; [1 1 1] - failed: distinct? spec: :user/vnum3
   (s/explain ::vnum3 [1 2 :a])   ;; not a number
  -;; In: [2] val: :a fails spec: ::vnum3 predicate: number?
  +;; :a - failed: number? in: [2] spec: :user/vnum3
   ----
   
   [NOTE]
  
positive.code: 
  (s/check-asserts true)
  (person-name 100)
  ;; CompilerException clojure.lang.ExceptionInfo: Spec assertion failed
  ;; val: 100 fails predicate: map?
  ;; :clojure.spec.alpha/failure  :assertion-failed
  ;; #:clojure.spec.alpha{:problems [{:path [], :pred map?, :val 100, :via [], :in []}], 
  ;;                      :failure :assertion-failed}
  ----
  
  A deeper level of integration is to call conform and use the return value to destructure the input. This will be particularly useful for complex inputs with alternate options.
  
negative.code: (s/conform ::seq-of-keywords [:a :b :c])
  ;;=> [:a :b :c]
  (s/explain ::seq-of-keywords [10 20])
  ;; 10 - failed: keyword? in: [0] spec: :user/seq-of-keywords
  
  (s/def ::odds-then-maybe-even (s/cat :odds (s/+ odd?)
                                       :even (s/? even?)))
  