$30 off During Our Annual Pro Sale. View Details »

Simple DSLs in Clojure

Simple DSLs in Clojure

Clojureで作る"simple"なDSL
Clojureらしい内部DSLの開発方法について簡単に紹介。
"simple"なアプローチでDSLを作ろう!

Kent OHASHI

October 09, 2020
Tweet

More Decks by Kent OHASHI

Other Decks in Programming

Transcript

  1. Clojure で作る "simple" な DSL

  2. 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"])
  3. Lisp 系⾔語で ( 内部 )DSL といえばマクロを使うもの ? マクロを定義すると コンパイル前にコード(AST) を⾃在に変換し

    評価を制御することができる マクロ⾃体は rst-class object ではないので composability が損なわれる
  4. Clojure コミュニティではマクロ定義は控えめ 「マクロ・クラブ」のルール 1. マクロを書くな 2. それがパターンをカプセル化する唯⼀の ⽅法ならば、マクロを書け cf. data

    > functions > macros data-driven, data-oriented なものを好む 『プログラミングClojure 第2 版』
  5. Clojure コミュニティでは "simple" であることを重視 ( のプレゼン) ⼀⾔でいえば、"simple" に設計しよう "simple" とは単⼀の役割/

    責務のみを上 ⼿く果たすこと cf. UNIX 哲学 "complex" にするのを避けて"simple" なもの を組み合わせよう Simple Made Easy Rich Hickey
  6. data-driven な DSL の例

  7. のテンプレート : 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."]])
  8. : SQL cf. ※開発予定 Salesforce のSQL ⾵⾔語 に対するDSL Honey SQL

    (def sqlmap {:select [:a :b :c] :from [:foo] :where [:= :f.a "baz"]}) lagenorhynque/honeysoql SOQL
  9. : ルーティング DSL bidi (def routes ["/" {"index.html" :index "articles/"

    {"index.html" :article-index [:id "/article.html"] :article}}])
  10. cf. : マクロベースのルーティング DSL Compojure (defroutes app (GET "/" []

    "<h1>Hello World</h1>") (route/not-found "<h1>Page not found</h1>"))
  11. : バリデーションスキーマ malli (def Address [:map [:id string?] [:tags [:set

    keyword?]] [:address [:map [:street string?] [:city string?] [:zip int?] [:lonlat [:tuple double? double?]]]]])
  12. data-driven だと何がうれしい ? Clojure でプログラム的に⾃由に操作できる ⾔語機能と標準ライブラリでそのまま扱える read (parse) も print

    もそのままできる Clojure データはclojure.spec で仕様を記述で きる Clojure データとしてどのように表現し、ど のように変換/ 解釈するかだけに集中できる 問題も"simple" になる
  13. 参考 : edn 形式 Clojure リテラル( のサブセット) によるシリア ライゼーションフォーマット Clojure

    にとってのS 式表現 ベクター、マップ、セットなどもある JavaScript にとってのJSON 相当 タグによる拡張も可能(extensible) Clojure とはedn 形式で表現されたデータを扱う ことに特化した⾔語ともいえる(?) edn (extensible data notation)
  14. Further Reading Clojure/ClojureScript 関連リンク集 - Qiita Data > Functions >

    Macros. But why? - LispCast