Skip to content

Instantly share code, notes, and snippets.

@lagenorhynque
Created April 21, 2022 09:39
Show Gist options
  • Save lagenorhynque/21c86613bd367ddef2470c6cb263578d to your computer and use it in GitHub Desktop.
Save lagenorhynque/21c86613bd367ddef2470c6cb263578d to your computer and use it in GitHub Desktop.
Modelling age of person in Clojure
user=> (require '[clojure.spec.alpha :as s]
#_=> '[clojure.spec.test.alpha :as st])
nil
user=> (s/def :person/age nat-int?)
:person/age
user=> (defn make-person [& {:keys [age]}]
#_=> #:person{:age age})
#'user/make-person
user=> (s/fdef make-person
#_=> :args (s/keys* :req-un [:person/age])
#_=> :ret (s/keys :req [:person/age]))
user/make-person
user=> (st/instrument)
[user/make-person]
user=> (make-person :age 20)
#:person{:age 20}
user=> (make-person :age 0)
#:person{:age 0}
user=> (make-person :age -1)
Execution error - invalid arguments to user/make-person at (REPL:1).
-1 - failed: nat-int? at: [:age] spec: :person/age
user=> (make-person {:age 0})
#:person{:age 0}
user=> (defn get-old [person]
#_=> (update person :person/age inc))
#'user/get-old
user=> (s/fdef get-old
#_=> :args (s/cat :person (s/keys :req [:person/age]))
#_=> :ret (s/keys :req [:person/age]))
user/get-old
user=> (st/instrument)
[user/get-old user/make-person]
user=> (get-old (make-person :age 20))
#:person{:age 21}
user=> (get-old {:age 20})
Execution error - invalid arguments to user/get-old at (REPL:1).
{:age 20} - failed: (contains? % :person/age) at: [:person]
@lagenorhynque
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment