Slide 1

Slide 1 text

Clojure で作る "simple" な DSL

Slide 2

Slide 2 text

lagénorhynque (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"])

Slide 3

Slide 3 text

Lisp 系⾔語で ( 内部 )DSL といえばマクロを使うもの ? マクロを定義すると コンパイル前にコード(AST) を⾃在に変換し 評価を制御することができる マクロ⾃体は rst-class object ではないので composability が損なわれる

Slide 4

Slide 4 text

Clojure コミュニティではマクロ定義は控えめ 「マクロ・クラブ」のルール 1. マクロを書くな 2. それがパターンをカプセル化する唯⼀の ⽅法ならば、マクロを書け cf. data > functions > macros data-driven, data-oriented なものを好む 『プログラミングClojure 第2 版』

Slide 5

Slide 5 text

Clojure コミュニティでは "simple" であることを重視 ( のプレゼン) ⼀⾔でいえば、"simple" に設計しよう "simple" とは単⼀の役割/ 責務のみを上 ⼿く果たすこと cf. UNIX 哲学 "complex" にするのを避けて"simple" なもの を組み合わせよう Simple Made Easy Rich Hickey

Slide 6

Slide 6 text

data-driven な DSL の例

Slide 7

Slide 7 text

のテンプレート : HTML React のJSX に相当するテンプレート Reagent (defn some-component [] [:div [:h3 "I am a component!"] [:p.someclass "I have " [:strong "bold"] [:span {:style {:color "red"}} " and red"] " text."]])

Slide 8

Slide 8 text

: SQL cf. ※開発予定 Salesforce のSQL ⾵⾔語 に対するDSL Honey SQL (def sqlmap {:select [:a :b :c] :from [:foo] :where [:= :f.a "baz"]}) lagenorhynque/honeysoql SOQL

Slide 9

Slide 9 text

: ルーティング DSL bidi (def routes ["/" {"index.html" :index "articles/" {"index.html" :article-index [:id "/article.html"] :article}}])

Slide 10

Slide 10 text

cf. : マクロベースのルーティング DSL Compojure (defroutes app (GET "/" [] "

Hello World

") (route/not-found "

Page not found

"))

Slide 11

Slide 11 text

: バリデーションスキーマ malli (def Address [:map [:id string?] [:tags [:set keyword?]] [:address [:map [:street string?] [:city string?] [:zip int?] [:lonlat [:tuple double? double?]]]]])

Slide 12

Slide 12 text

data-driven だと何がうれしい ? Clojure でプログラム的に⾃由に操作できる ⾔語機能と標準ライブラリでそのまま扱える read (parse) も print もそのままできる Clojure データはclojure.spec で仕様を記述で きる Clojure データとしてどのように表現し、ど のように変換/ 解釈するかだけに集中できる 問題も"simple" になる

Slide 13

Slide 13 text

参考 : edn 形式 Clojure リテラル( のサブセット) によるシリア ライゼーションフォーマット Clojure にとってのS 式表現 ベクター、マップ、セットなどもある JavaScript にとってのJSON 相当 タグによる拡張も可能(extensible) Clojure とはedn 形式で表現されたデータを扱う ことに特化した⾔語ともいえる(?) edn (extensible data notation)

Slide 14

Slide 14 text

Further Reading Clojure/ClojureScript 関連リンク集 - Qiita Data > Functions > Macros. But why? - LispCast