Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Clojureで作る"simple"なDSL

 Clojureで作る"simple"なDSL

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

Avatar for Kent OHASHI

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)