(defprofile lagénorhynque
:id @lagenorhynque
:reading "/laʒenɔʁɛ̃k/"
:aliases ["カマイルカ🐬"]
:languages [Clojure Haskell English français]
:interests [programming language-learning law mathematics]
:commits ["github.com/lagenorhynque/duct.module.pedestal"
"github.com/lagenorhynque/duct.module.cambium"]
:contributes ["github.com/japan-clojurians/clojure-site-ja"])
- マクロを定義すると
-
コンパイル前にコード(AST)を自在に変換し評価を制御することができる
-
マクロ自体はfirst-class objectではないのでcomposabilityが損なわれる
-
-
「マクロ・クラブ」のルール
-
- マクロを書くな
-
- それがパターンをカプセル化する唯一の方法ならば、マクロを書け
-
-
data > functions > macros
- data-driven, data-orientedなものを好む
- Simple Made Easy (Rich Hickeyのプレゼン)
-
一言でいえば、"simple"に設計しよう
- "simple"とは単一の役割/責務のみを上手く果たすこと
- cf. UNIX哲学
-
"complex"にするのを避けて"simple"なものを組み合わせよう
-
Reagentのテンプレート: HTML
ReactのJSXに相当するテンプレート
(defn some-component []
[:div
[:h3 "I am a component!"]
[:p.someclass
"I have " [:strong "bold"]
[:span {:style {:color "red"}} " and red"]
" text."]])
Honey SQL: SQL
(def sqlmap {:select [:a :b :c]
:from [:foo]
:where [:= :f.a "baz"]})
- cf. lagenorhynque/honeysoql ※開発予定
- SalesforceのSQL風言語SOQLに対するDSL
bidi: ルーティングDSL
(def routes ["/" {"index.html" :index
"articles/" {"index.html" :article-index
[:id "/article.html"] :article}}])
cf. Compojure: マクロベースのルーティングDSL
(defroutes app
(GET "/" [] "<h1>Hello World</h1>")
(route/not-found "<h1>Page not found</h1>"))
malli: バリデーションスキーマ
(def Address
[:map
[:id string?]
[:tags [:set keyword?]]
[:address
[:map
[:street string?]
[:city string?]
[:zip int?]
[:lonlat [:tuple double? double?]]]]])
- Clojureでプログラム的に自由に操作できる
-
言語機能と標準ライブラリでそのまま扱える
-
read
(parse)もprint
もそのままできる -
Clojureデータはclojure.specで仕様を記述できる
-
Clojureデータとしてどのように表現し、どのように変換/解釈するかだけに集中できる
- 問題も"simple"になる
-
-
edn (extensible data notation)
-
Clojureリテラル(のサブセット)によるシリアライゼーションフォーマット
-
ClojureにとってのS式表現
- ベクター、マップ、セットなどもある
- JavaScriptにとってのJSON相当
-
タグによる拡張も可能(extensible)
-
-
Clojureとはedn形式で表現されたデータを扱うことに特化した言語ともいえる(?)