Kotlin で DSL を作り始めるまで

Kotlin で DSL を作り始めるまで

Kotlin Fest 2018 での 3分 LT です。

F46a37b9f855c245f72a07b04045216a?s=128

Tomoya Miwa

August 25, 2018
Tweet

Transcript

  1. Kotlin で DSL を作り始めるまで tomoya0x00 Kotlin Fest 2018

  2. ⾃⼰紹介 tomoya0x00 Twitter, GitHub, Qiita Android, Embedded system, BLE/BT, iOS

    DeNAでタクベルつくってます
  3. DSLとは︖

  4. DSLとは︖ Domain Speci c Language の略で特定ドメインに特化した⾔語 HTMLとか、SQLとかもある意味DSL KotlinやJavaなどのプログラミング⾔語に⽐べて汎⽤性は低い 汎⽤性を下げることで、特定分野で使いやすくしている

  5. DSLの何が嬉しいのか 特定ドメインに特化しているので、読みやすい&書きやすい ボイラープレートのような冗⻑な記述を減らせるかも IDEなどでコード補完できる

  6. FSM DSL in Kotlin https://speakerdeck.com/tomoya0x00/fsm-dsl-in-kotlin 以前、 Kotlin Developers Meetup で

    LT させて頂いた
  7. 例︓FSM DSL

  8. 例︓FSM DSL val sm = stateMachine(initial = MyState.NotLoaned) { state(MyState.NotLoaned)

    { edge(MyEvent.PressRental, next = MyState.Lock) } state(MyState.OnLoan, entry = { println("turnOnRentalLed") }, exit = { println("turnOffRentalLed") }) { state(MyState.Lock) { edge(MyEvent.PressReturn, next = MyState.NotLoaned) edge(MyEvent.PressUnLock, next = MyState.UnLock) } state(MyState.UnLock) { edge(MyEvent.PressLock, next = MyState.Lock) } } }
  9. DSL、作ってみたくなりましたか︖

  10. 作り始めるまでの流れをご紹介 ⾃分の実体験+α

  11. Step1 DSLを具体的にどのようにして実現するのか 基本を学んでイメージを掴む

  12. Kotlin Koans

  13. Kotlin Koans This tutorial walks you through a series of

    exercises to get familiar with Kotlin. https://kotlinlang.org/docs/tutorials/koans.html
  14. Koans の Builders HTMLを⽣成するDSLをつくるお題

  15. DSLの抜粋 html { table { tr (color = getTitleColor()) {

    td { text("Product") } td { text("Price") } td { text("Popularity") } } } }
  16. ほとんどHTML

  17. どうやって実現しているのか︖

  18. 説明は省略(時間が⾜りない) Koansやってみてください︕︕

  19. Creating DSLs in Kotlin JetBrains 社の Hadi Hariri ⽒による講演 https://www.youtube.com/watch?v=TGdAvY5i-sU

    もちろん全部英語ですが、 実際にコードを書きながら説明して下さっている ⼀度 Koans の Builders をやっておけば、より理解しやすい ので、英語苦⼿でもなんとかなると思います︕ (YouTubeの⾃動⽣成英語字幕とっても便利)
  20. ⾃分が参考になった点 Builder @DslMarker

  21. 説明は省略(時間が⾜りない) 講演動画みてください︕︕

  22. Step2 DSLの⽂法を考える

  23. DSLの⽂法を考える 1. DSL⾃体のmustとwantをまとめる 2. 既存のDSLをググって⾒てみる 3. DSLの⽂法案をまとめる

  24. 例︓FSM DSLの場合

  25. 1. DSL⾃体のmustとwantをまとめる must ⼊れ⼦の状態遷移に対応(最低でも1階層の⼦を持てる) Composite state onEntry/onExit対応

  26. 1. DSL⾃体のmustとwantをまとめる want 状態遷移図が吐ける PlantUML記法で出⼒ 宣⾔的に書ける Testable Android Thingsなどでも使える軽量なもの Rxやcoroutine拡張

  27. 2. 既存のDSLをググって⾒てみる "fsm dsl kotlin" でググる︕ 取り⼊れたいところ、逆に改善したいところを⾒つける ⼊れ⼦の状態遷移に対応しているのは⾒当たらない 状態名を⽂字列で渡すのはやめておきたい

  28. 3. DSLの⽂法案をまとめる // StateとEventはsealed classとして宣⾔ stateMachine { state(StateA, onEntry =

    {}, onExit = {}) { edge(EventA, StateC) {/* action */} state(StateB, onEntry = {}, onExit = {}) } }
  29. この後は︖

  30. この後は︖ 1. まずはDSLのコンパイルだけを通す 2. DSLを実際に動かすために必要なデータ構造を考える(FSMでは重要 だった) 3. DSLから 2. で考えたデータ構造への変換処理を書く

    4. データ構造を使⽤して実際に動くコードを書く
  31. Thank you!

  32. Kotlinかわいい︕