Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【LT資料】ラムダ式でDSL

 【LT資料】ラムダ式でDSL

【とらのあな主催】オタクがKotlinを追うライトニングトークイベント2回目の発表資料です。

More Decks by 虎の穴ラボ株式会社

Other Decks in Technology

Transcript

  1. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. ラムダ式でDSL ΦλΫ͕,PUMJOΛ௥͏ϥΠτχϯάτʔΫΠϕϯτճ໨ גࣜձࣾދͷ݀ ։ൃࣨ ্ా ণ׮
  2. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. 今回話すこと 1. はじめに(自己紹介) 2. Kotlinでのラムダ式について 3. レシーバー付きラムダ式について 4. SQLビルダー自作の紹介 5. まとめ 2
  3. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. 上田昌寛 • 2017年5月虎の穴入社 • KEEPER,クラフトの運用/開発 主に使う言語 お仕事:Ruby, JavaScript プライベート:Go TypeScriptも勉強したい… 3
  4. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. はじめに 1. Kotlinのラムダ式とJavaのラムダとどう違うの? 2. レシーバー付きラムダ式ってなに? 4 <発表内容> ・Kotlin言語特有のラムダ式の書き方,レシーバー付きラムダ式の説明 ・(応用として)理解を深めるため自分でDSLを自作 (今回はSQLビルダーっぽいもの)
  5. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. JavaのラムダとKotlinのラムダの違い 5 Javaの場合(インターフェースを実装した無名クラスが作られる) Kotlinの場合:関数そのものを変数として代入する事ができる。 Kotlinの関数=第一級オブジェクト
  6. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式 6 レシーバーとは? 辞書:(物を受ける)容器。受信機。といった意味 オブジェクト指向: 手続き(メソッド)を呼び出す対象のオブジェクト
  7. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式 7 .(ドット)よりも左側がレシーバー
  8. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式 8 何度もレシーバーを書くパターン(経験有りますか?) ここを省略したい!
  9. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ 9 レシーバー付き関数を引数に取るようにする場合 レシーバーがStringBuilder型である事 普通の関数を引数に取るようにする場合
  10. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ 10 StringBuilder型のメソッドをレシーバー無しで呼び出す ここでレシーバー付き関数が呼び出される レシーバー付きラムダの実装
  11. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式 11 Kotlinの標準ライブラリのwith関数を使って同様の事ができる レシーバー付きラムダ
  12. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL 12 DSLとは... Domain Specific Languageの略 ドメイン固有言語
  13. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL 13 レシーバー付きラムダ式を活用してDSLを実装してい る事例があります。
  14. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL事例① 14 kotlinx.htmlのHTMLビルダー GitHub: https://github.com/Kotlin/kotlinx.html 結果
  15. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL 事例② 15 Gradleのタスク処理(Groovyではなく...) build.gradle.kts 結果
  16. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL 16 今回は... SQLっぽく書けるようにDSLを自作して SQL文を出力するまでを実装
  17. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL 17 SQLテーブルを定義するオブジェクトを 作成 query関数のラムダ式の中でSQLを 記載
  18. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL 18 query関数に渡すラムダ式の外での select関数は名前解決できない!
  19. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL 19 抜粋:query関数と、QUERYクラスの実装 1.QUERYクラスのメソッドに利用できるメソッドを定義 (利用するSQLの節を定義する) 2. query関数の引数にQUERYクラスをレシーバーとする拡張関数を宣言 1 2
  20. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. レシーバ付きラムダ式でDSL 20 抜粋:SELECTクラスと、FROMクラスの実装 <役割> クラス定義:それぞれのSQL節の文字列変換する実装 関数宣言:SQLの文法規則に即してメソッド定義(SQL節)を構造的に宣言 する 引数から受け取った表示するカラム名を追加
  21. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright © 2019

    Toranoana Inc. All Rights Reserved. まとめ Kotlinのラムダ式(レシーバ付き)についての話 ➔ Kotlinの言語仕様の柔軟性でDSLなどの応用も期待 できる ➔ 思った以上に自分の想像のDSLが自作できた。 ➔ テーブル宣言にSQL側の型情報を載せるとクエリー 結果のデータバインドもできそう…。 ➔ Exposed でOK ➔ (なにより)レシーバー付きラムダ式楽しい!! 21