Created
April 21, 2022 09:39
-
-
Save lagenorhynque/21c86613bd367ddef2470c6cb263578d to your computer and use it in GitHub Desktop.
Modelling age of person in Clojure
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Inspired by Clojureでもドメイン指向な設計がやりたい - Qiita.