Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin で DSL を作り始めるまで
Search
Tomoya Miwa
August 25, 2018
Programming
2
350
Kotlin で DSL を作り始めるまで
Kotlin Fest 2018 での 3分 LT です。
Tomoya Miwa
August 25, 2018
Tweet
Share
More Decks by Tomoya Miwa
See All by Tomoya Miwa
できる!ComposeでCollapsingToolbar
tomoya0x00
0
540
Compose の LazyColumn パフォーマンス改善で取り組んだこと
tomoya0x00
0
1.6k
ComposeのMutableStateってどうやってLocal Unit Testすれば良いの??
tomoya0x00
0
880
意外と簡単?Navigation rail導入のお話
tomoya0x00
0
1.1k
Kotlin Coroutines Flow を触ってみた話し
tomoya0x00
2
680
Android for Carsのお話し
tomoya0x00
1
940
熟成されたアプリのmulti module化(halfway)
tomoya0x00
2
780
コードカバレッジを⾒つつユニットテストを書く
tomoya0x00
0
350
multi module へ向けて
tomoya0x00
0
490
Other Decks in Programming
See All in Programming
Site Reliability Engineering for GMO
pyama86
7
1k
Amazon SQSコンシューマー疎結合への旅 - 出張! #DevelopersIO IT技術ブログの中の人が語る勉強会 #3
quiver
0
220
Java 22 Overview
kishida
1
180
新宿ダンジョンを可視化してみた
satoshi7190
2
220
Behind VS Code Extensions for JavaScript / TypeScript Linnting and Formatting
unvalley
5
880
Git Lint
bkuhlmann
4
750
ゆるい個人開発のススメ
kuroppe1819
10
980
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.3k
Rails と人魚の話/rails-and-mermaid
sanfrecce_osaka
0
100
CA.swift19 恋するAIアプリ開発の裏側
oskmr
0
360
Blue/Greenデプロイの導入による 運用フローの改善
kudoas
1
360
Azure OpenAI Serviceのプロンプトエンジニアリング入門
tomokusaba
3
640
Featured
See All Featured
Designing the Hi-DPI Web
ddemaree
276
33k
Building Adaptive Systems
keathley
30
1.9k
4 Signs Your Business is Dying
shpigford
175
21k
Atom: Resistance is Futile
akmur
258
25k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3k
Clear Off the Table
cherdarchuk
83
310k
The Power of CSS Pseudo Elements
geoffreycrofte
59
5k
The Language of Interfaces
destraynor
151
23k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
119
39k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
GitHub's CSS Performance
jonrohan
1024
450k
Transcript
Kotlin で DSL を作り始めるまで tomoya0x00 Kotlin Fest 2018
⾃⼰紹介 tomoya0x00 Twitter, GitHub, Qiita Android, Embedded system, BLE/BT, iOS
DeNAでタクベルつくってます
DSLとは︖
DSLとは︖ Domain Speci c Language の略で特定ドメインに特化した⾔語 HTMLとか、SQLとかもある意味DSL KotlinやJavaなどのプログラミング⾔語に⽐べて汎⽤性は低い 汎⽤性を下げることで、特定分野で使いやすくしている
DSLの何が嬉しいのか 特定ドメインに特化しているので、読みやすい&書きやすい ボイラープレートのような冗⻑な記述を減らせるかも IDEなどでコード補完できる
FSM DSL in Kotlin https://speakerdeck.com/tomoya0x00/fsm-dsl-in-kotlin 以前、 Kotlin Developers Meetup で
LT させて頂いた
例︓FSM DSL
例︓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) } } }
DSL、作ってみたくなりましたか︖
作り始めるまでの流れをご紹介 ⾃分の実体験+α
Step1 DSLを具体的にどのようにして実現するのか 基本を学んでイメージを掴む
Kotlin Koans
Kotlin Koans This tutorial walks you through a series of
exercises to get familiar with Kotlin. https://kotlinlang.org/docs/tutorials/koans.html
Koans の Builders HTMLを⽣成するDSLをつくるお題
DSLの抜粋 html { table { tr (color = getTitleColor()) {
td { text("Product") } td { text("Price") } td { text("Popularity") } } } }
ほとんどHTML
どうやって実現しているのか︖
説明は省略(時間が⾜りない) Koansやってみてください︕︕
次
Creating DSLs in Kotlin JetBrains 社の Hadi Hariri ⽒による講演 https://www.youtube.com/watch?v=TGdAvY5i-sU
もちろん全部英語ですが、 実際にコードを書きながら説明して下さっている ⼀度 Koans の Builders をやっておけば、より理解しやすい ので、英語苦⼿でもなんとかなると思います︕ (YouTubeの⾃動⽣成英語字幕とっても便利)
⾃分が参考になった点 Builder @DslMarker
説明は省略(時間が⾜りない) 講演動画みてください︕︕
Step2 DSLの⽂法を考える
DSLの⽂法を考える 1. DSL⾃体のmustとwantをまとめる 2. 既存のDSLをググって⾒てみる 3. DSLの⽂法案をまとめる
例︓FSM DSLの場合
1. DSL⾃体のmustとwantをまとめる must ⼊れ⼦の状態遷移に対応(最低でも1階層の⼦を持てる) Composite state onEntry/onExit対応
1. DSL⾃体のmustとwantをまとめる want 状態遷移図が吐ける PlantUML記法で出⼒ 宣⾔的に書ける Testable Android Thingsなどでも使える軽量なもの Rxやcoroutine拡張
2. 既存のDSLをググって⾒てみる "fsm dsl kotlin" でググる︕ 取り⼊れたいところ、逆に改善したいところを⾒つける ⼊れ⼦の状態遷移に対応しているのは⾒当たらない 状態名を⽂字列で渡すのはやめておきたい
3. DSLの⽂法案をまとめる // StateとEventはsealed classとして宣⾔ stateMachine { state(StateA, onEntry =
{}, onExit = {}) { edge(EventA, StateC) {/* action */} state(StateB, onEntry = {}, onExit = {}) } }
この後は︖
この後は︖ 1. まずはDSLのコンパイルだけを通す 2. DSLを実際に動かすために必要なデータ構造を考える(FSMでは重要 だった) 3. DSLから 2. で考えたデータ構造への変換処理を書く
4. データ構造を使⽤して実際に動くコードを書く
Thank you!
Kotlinかわいい︕