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

    評価を制御することができる マクロ⾃体は rst-class object ではないので composability が損なわれる
  3. Clojure コミュニティでは "simple" であることを重視 ( のプレゼン) ⼀⾔でいえば、"simple" に設計しよう "simple" とは単⼀の役割/

    責務のみを上 ⼿く果たすこと cf. UNIX 哲学 "complex" にするのを避けて"simple" なもの を組み合わせよう Simple Made Easy Rich Hickey
  4. のテンプレート : 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."]])
  5. : SQL cf. ※開発予定 Salesforce のSQL ⾵⾔語 に対するDSL Honey SQL

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

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

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

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

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

    にとってのS 式表現 ベクター、マップ、セットなどもある JavaScript にとってのJSON 相当 タグによる拡張も可能(extensible) Clojure とはedn 形式で表現されたデータを扱う ことに特化した⾔語ともいえる(?) edn (extensible data notation)