Skip to content

Instantly share code, notes, and snippets.

View lagenorhynque's full-sized avatar
🐬
architecting & managing

Kent OHASHI lagenorhynque

🐬
architecting & managing
View GitHub Profile
;; cf. https://rosettacode.org/wiki/Y_combinator#Clojure
user> (((fn [f]
((fn [x] (x x))
(fn [x]
(f (fn [& args]
(apply (x x) args))))))
(fn [f]
(fn [n]
(if (zero? n)
1
;; cf. https://github.com/lagenorhynque/spec-examples/blob/master/src/spec_examples/geometry.clj
user> (require '[clojure.spec.alpha :as s]
'[clojure.spec.test.alpha :as stest]
'[clojure.spec.gen.alpha :as gen]
'[spec-examples.geometry :as geo])
nil
user> (gen/generate (s/gen ::geo/shape))
#:spec-examples.geometry{:side-a 0.0048370361328125, :type :spec-examples.geometry/cube}
user> (gen/sample (s/gen ::geo/shape))
(#:spec-examples.geometry{:radius 0.5, :type :spec-examples.geometry/sphere} #:spec-examples.geometry{:side-a 1.0, :side-b 1.0, :side-c 0.75, :type :spec-examples.geometry/cuboid} #:spec-examples.geometry{:radius 1.0, :type :spec-examples.geometry/sphere} #:spec-examples.geometry{:side-a 1.0, :type :spec-examples.geometry/cube} #:spec-examples.geometry{:side-a 1.0, :side-b 0.5, :side-c 1.265625, :type :spec-examples.geometry/cuboid} #:spec-examples.geometry{:radius 0.9375, :type :spec-examples.geometry/sphere} #:spec-examples.geometry{:side-a 0.8125, :si
@lagenorhynque
lagenorhynque / spectacular-future-with-clojure-spec.md
Last active November 11, 2022 07:17
Spectacular Future with clojure.spec

Spectacular Future

with clojure.spec


Self-introduction

lagénorhynque /laʒenɔʁɛ̃k/ カマイルカ

;; cf. https://github.com/lagenorhynque/spec-examples/blob/master/src/spec_examples/geometry.clj
user> (require '[clojure.spec.alpha :as s]
'[clojure.spec.test.alpha :as stest]
'[spec-examples.geometry :as geo])
nil
user> (stest/instrument)
[spec-examples.geometry/volume]
user> (geo/volume #::geo{:type ::geo/sphere
:radius 3.0})
113.09733552923251
;; cf. http://qiita.com/snmsts@github/items/ef625bd6be7e685843ca
user> (let [q '(r s)]
``(q
~q
~~q
~@q
~~'q
~'~q
'~~q
~@~q
;; cf. https://8thlight.com/blog/patrick-gombert/2013/11/26/lispy-elixir.html
user> (defmacro describe [_ & specs]
`(do ~@specs))
#'user/describe
user> (defmacro it [name spec]
`(defn ~(symbol (str (clojure.string/replace name #"\s" "-")
"-spec"))
[]
~spec))
#'user/it
user=> (defn foo [n]
#_=> (let [n (atom n)]
#_=> #(swap! n + %)))
#'user/foo
user=> (def f (foo 5))
#'user/f
user=> (f 1)
6
user=> (f 3)
9
user=> (defn my-odd? [n]
#_=> (letfn [(odd? [n]
#_=> (if (zero? n)
#_=> false
#_=> (even? (dec n))))
#_=> (even? [n]
#_=> (if (zero? n)
#_=> true
#_=> (odd? (dec n))))]
#_=> (odd? n)))
user=> (require '[schema.core :as s])
nil
user=> (s/defn str->int :- s/Int
#_=> [s :- s/Str]
#_=> (Integer/parseInt s))
#'user/str->int
user=> (str->int "123")
123
user=> (str->int 1)
user> (require '[clojure.spec.alpha :as s])
nil
;; メールアドレス文字列のspec定義
user> (s/def :domain/mail-address
(s/and string?
#(re-matches #"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?" %)))
:domain/mail-address
;; メールアドレス文字列のバリデーション
user> (s/valid? :domain/mail-address "xxx@yyyy.zzz")
true