Instantly share code, notes, and snippets.

View ex.clj
;; launch with
;; clj -Srepro -Sdeps '{:deps {org.clojure/test.check {:mvn/version "0.9.0"} org.clojure/clojure {:mvn/version "1.10.0-beta8"}}}'
(require '[clojure.spec.alpha :as s])
(require '[clojure.spec.test.alpha :as st])
;; instrumenting a function
(s/fdef foobar :args (s/cat :x int?))
(defn foobar [x] x)
View init.cljs
(require '[cljs.spec.alpha :as s])
(require '[cljs.spec.test.alpha :as stest])
(require '[expound.alpha :as expound])
(require '[speculative.core])
(set! s/*explain-out* (expound/custom-printer {:show-valid-values? true}))
(stest/instrument `map)
(try
(map 'lol 'lol)
(catch :default e
(println (.-message e))))
View ex.txt
> clj -Sdeps '{:deps {org.clojure/clojure {:mvn/version "1.10.0-alpha8"}}}'
Clojure 1.10.0-alpha8
user=> (require '[clojure.spec.alpha :as s])
nil
user=> ;; `explain-data` returns a description of the problem, including the `:in` path
user=> ;; which is the location of the invalid data within the context of the larger
user=> ;; data structure
user=> (-> (s/explain-data (s/coll-of int?) [1 "2"]) ::s/problems first)
{:path [], :pred int?, :val "2", :via [], :in [1]}
user=> (-> (s/explain-data (s/coll-of int?) [1 "2"]) ::s/problems first :in)
View repl.txt
➜ ~ rlwrap clj -Srepro -Sdeps '{:deps {org.clojure/spec.alpha {:mvn/version "0.2.176"}}}'
Clojure 1.9.0
user=> (require '[clojure.spec.alpha :as s])
nil
user=> (s/def ::point1 (s/cat :x int? :y int?))
user/point1
user=> (s/def ::x int?)
:user/x
user=> (s/def ::y int?)
:user/y
View simple_coerce.clj
;; Code is largely copied from
;; https://github.com/wilkerlucio/spec-coerce/blob/master/src/spec_coerce/core.cljc
;; with minor modifications!
(ns example.coercion
(:require [clojure.walk :as walk]
[clojure.spec.alpha :as s]))
(defonce ^:private registry-ref (atom {}))
;; WARNING - only works if all unqualified kw are unique!!!!
View repl.txt
Clojure 1.9.0
user=> (require '[clojure.spec.alpha :as s])
nil
user=> (require '[expound.alpha :as expound])
nil
user=> (set! s/*explain-out* (expound/custom-printer {:theme :figwheel-theme :print-specs? false}))
#object[expound.alpha$custom_printer$fn__897 0x534243e4 "expound.alpha$custom_printer$fn__897@534243e4"]
user=> (s/check-asserts true)
true
user=> (defrecord Person [first-name last-name])
View repro.clj
(require '[clojure.spec.alpha :as s])
(set! s/*explain-out* (fn [ed] (println "failed")))
(let [x] 1)
;; with org.clojure/spec.alpha {:mvn/version "0.2.168"} :
;; CompilerException clojure.lang.ExceptionInfo: Call to clojure.core/let did not conform to spec:
;; failed
;; #:clojure.spec.alpha{:problems [{:path [:args :bindings :init-expr], :reason "Insufficient input", :pred clojure.core/any?, :val (), :via [:clojure.core.specs.alpha/bindings :clojure.core.specs.alpha/bindings], :in [0]}], :spec #object[clojure.spec.alpha$regex_spec_impl$reify__2499 0x749c877b "clojure.spec.alpha$regex_spec_impl$reify__2499@749c877b"], :value ([x] 1), :args ([x] 1)}, compiling:(NO_SOURCE_PATH:3:1)
View multimethod_selector.clj
(require '[clojure.spec.gen.alpha :as sgen])
;; original
(defn multimethod-selector
"Returns a generator that picks one dispatch value from the known
dispatch values of a multimethod. Defers the lookup of dispatch
values until sampling time, so any defmethods evaluated after the
generator is created may still be selected."
[s]
#(sgen/bind
View ex.clj
(require '[clojure.test.check.generators :as gen2])
(require '[clojure.spec.alpha :as s])
(s/def :aero/path (s/coll-of simple-keyword? :kind vector? :min-count 1 :max-count 3))
(defn aero-map [paths vals-or-refs backups]
(->> (map vector paths vals-or-refs backups)
(reduce
(fn [m [p [t v] [_ backup-v]]]
(case t
View gist:910f718e2da57793bc0f5817f006f28a
> clj -Sdeps '{:deps {expound {:mvn/version "0.7.1"}}}'
Clojure 1.9.0
user=> (require '[expound.alpha :as expound] '[clojure.spec.alpha :as s])
nil
user=> ;; default printer is used
user=> (future (s/explain int? "a"))
val: "a" fails predicate: :clojure.spec.alpha/unknown
#object[clojure.core$future_call$reify__8097 0x99a65d3 {:status :ready, :val nil}]
user=> (set! s/*explain-out* expound/printer)
#object[expound.alpha$printer 0x4ad4936c "expound.alpha$printer@4ad4936c"]