SlideShare a Scribd company logo
1 of 19
Download to read offline
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
Kotlinで雑に作るLispインタープリタ
虎の穴ラボ 藤原 佳顕
1
2019.03.19 オタクがKotlinを追うライトニングトークイベント
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
アジェンダ
• 自己紹介
• はじめに
• 動機
• Lispの軽い説明
• 字句解析編
• 構文解析編
• eval編
2
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
自己紹介
(hash-map
:name "藤原 佳顕(28)"
:desc "にわかLisperかつフロントエンドマン"
:work "Fantiaでフロント周りを中心に色々"
:like (hash-map :game '("レイストーム" "ダライアス外伝")
:anime '("スクライド" "Show By Rock")
:tech '("Clojure" "TypeScript")))
3
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
はじめに
• Kotlinの勉強がてら簡単なLispを(雑に)
実装してみているので紹介します。
• 本LTには以下の要素が含まれます
– Any型
– null安全の破壊
– 安全じゃないキャスト
4
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
• 言語を勉強するときはなにか作りたい!
– Webアプリはフレームワークも知らないとつらい・・・
– ほぼ素のKotlinで書けるCUIアプリにしよう!
• Lisp方言をちょっと触っていたこともあり実装が簡単そうなLispイン
タープリターの実装を通してKotlinの文法などを知ろう!というモチ
ベーション
5
動機
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
Lispの軽い説明
突然ですがみなさん・・・
Lispってご存知でしょうか?
6
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
Lispの軽い説明
Lispのよく聞くイメージ
• かっこが多い(+ 1 (- 9 ( * (/ 2 5) (+ 1 29))))
• 変態が使う言語
• エイリアン
7
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
Lispの軽い説明
Lispは(拡張がなければ)文法が簡単!!
• 基本的にはカッコと予約語だけ(S式)
• 今回は時間と紙面の都合で以下の中でも四則演算と比較演算子、ifが実行で
きるまで実装します
(+ 1 (- 100 99)) ;;=> 四則演算 1 + (100 - 99) = 2
(= 1 1) ;;=> true
(> 1 1) ;;=> false
(< 1 1) ;;=> false
(if (= 1 1) "True" "False") ;; 特殊形式ifの例
8
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
字句解析
今回は雑に作るので、手抜きします。
※“(+ 1 1)” → [“(“, “+”, “1”, “1”, “)”]に分解しているだけ
9
const val LEFT_BRACES = "("
const val RIGHT_BRACES = ")"
const val SPACE = " "
// 文字列を空白でパースしてトークンのリストに変換
fun tokenize(line: String): List<String> =
line.replace(LEFT_BRACES, "$SPACE$LEFT_BRACES$SPACE")
.replace(RIGHT_BRACES, "$SPACE$RIGHT_BRACES$SPACE")
.split(SPACE).map { it.trim() }.filterNot { it.isBlank() }
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
字句解析(テスト)
10
describe("tokenizeを呼んだ時") {
it("文字列が入力された場合文字列のリストが生成される") {
assertEquals(listOf("(", "+", "1", "1", ")"), tokenize("(+ 1 1)"))
}
it("入れ子のカッコの場合") {
assertEquals(listOf("(", "+", "1", "(", "*", "3", "10", ")", ")"), tokenize("(+ 1 (* 3 10))"))
}
context("S式として不正な場合でもトークン化は正常に終わること") {
it("左括弧が無い") {
assertEquals(listOf("+", "1", "1", ")"), tokenize("+ 1 1)"))
}
it("右括弧が無い") {
assertEquals(listOf("(", "+", "1", "1"), tokenize("(+ 1 1"))
}
it("カッコの対応が不正") {
assertEquals(listOf("(", "+", "1", "*", "3", "10", ")", ")"), tokenize("(+ 1 * 3 10))"))
}
}
}
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
構文解析
Lispのプログラムの形をよく見ると・・・
(+ 1 (- 100 99))
プログラム自体が再帰構造になっている!!
⇛しかし…Javaは末尾再帰最適化してくれないらしい
11
外側の括弧の演算 内側の括弧の演算
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
構文解析(データ構造
データ構造自体も再帰構造とします
12
class Cell(val parent: Atom<out Any>,
val children: MutableList<Cell>)
{}
関数とか特殊形式とかを表したもの 引数リストとか。型を自分自身に
することで括弧の入れ子対応を考
えない
出力イメージ: [“+”, 1, [“-”, 100 99]]
parent
parentchildren children
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
構文解析(ロジック)
tailrec fun read(tokens: List<String>,
cell: Cell? = null,
braceStack: List<Cell> = listOf()): Cell?
{
// 中身省略
}
13
末尾再帰するためのキーワード
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
構文解析(ロジック)
14
DECOMPILEしてみた(Kotlin→バイトコード→Java)
@Nullable
public static final Cell read(@NotNull List tokens,
@Nullable Cell cell,
@NotNull List braceStack)
{
while(true) {
// 中身省略
if (tokens.isEmpty()) { // 全トークンが処理完了したら終わり
Collection var19 = (Collection)braceStack;
if (!var19.isEmpty()) {
throw (Throwable)(new BraceError("( is not found"));
}
return cell;
} // 以降も省略
}
}
再帰がループに置き換えられている!!
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved. 15
!!WARNING!!
ここから先は以下の要素が含まれます。
● Any型の乱用
● なんの保証もないキャスト
● null安全の崩壊
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
eval編(準備)
16
構文解析はできたので次は評価をしよう!まずは組み込み関数から
// TODO: lambda.refrect()メソッドから生成される KFunctionとcallメソッドを使いたかった
// が、KFunction自体がexperimental
fun initEnv(): Env { //Envの実体はKeyが文字でValueがラムダ式(Anyにしちゃってますが )のHashMap
val env = Env()
env.put("+") { args: List<Any>? ->
args!!.fold(0) { acc, number -> acc + (number as Int) }
}
// 略
env.put(">") { args: List<Any>? ->
(1..(args!!.size - 1)).map {
Pair(args[it - 1], args[it])
}.all { (it.first as Int) > (it.second as Int) }
}
// 略
return env
}
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
eval編(実行)
17
Cellクラスのevalメソッドを呼びます。
fun eval(env: Env): Any? {
return when (parent) {
// 各シンボルに対して自身が持つevalメソッドを呼び出していく
is Symbol -> parent.eval(env)?.invoke(
// 引数の評価はchildrenのevalを呼び出す。(実質)再帰になっている
children.map {elem -> elem.eval(env)!!}
)
is If -> parent.eval(env)?.invoke(children)
is Num -> parent.eval()
is Str -> parent.eval()
else -> null
}
}
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
デモ
18
(REPL起動)
虎の穴 虎の穴 虎の穴 虎の穴 虎の穴
虎の穴
Copyright © 2019 Toranoana Inc. All Rights Reserved.
まとめ
• KotlinでLispの各種演算とifを実装することができました
• 感じたメリット
– 再帰処理などはJavaに比べて書きやすい
– 関数についてもラムダ式で直感的に書ける
• 今後:関数定義あたりまではやりたいと思っています
• 型をあえてつけてほしくない場合の処理がイマイチ
– sealedクラスとか使いこなせば・・・
• KFunctionはよ・・・
19

More Related Content

What's hot

NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
Farmnote が技術で牛と人をつなげるまで - Data engineering and data analysis workshop #6
Farmnote が技術で牛と人をつなげるまで - Data engineering and data analysis workshop #6Farmnote が技術で牛と人をつなげるまで - Data engineering and data analysis workshop #6
Farmnote が技術で牛と人をつなげるまで - Data engineering and data analysis workshop #6Nobuteru Kawano
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回Project Samurai
 
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)Shuyo Nakatani
 
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Kotaro Nakayama
 
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸Takahiro Iwase
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回Project Samurai
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回Project Samurai
 
Rでウォーリを探してみた
Rでウォーリを探してみたRでウォーリを探してみた
Rでウォーリを探してみたKazuya Wada
 
Jiro And Database Spsm0922
Jiro And Database Spsm0922Jiro And Database Spsm0922
Jiro And Database Spsm0922akitsukada
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめgion_XY
 
二階堂愛と二階堂藍の違いについて
二階堂愛と二階堂藍の違いについて二階堂愛と二階堂藍の違いについて
二階堂愛と二階堂藍の違いについてshow you
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
Juliaを使った機械学習
Juliaを使った機械学習Juliaを使った機械学習
Juliaを使った機械学習Aki Ariga
 
Kotlinではじめる Webアプリケーション入門
Kotlinではじめる Webアプリケーション入門Kotlinではじめる Webアプリケーション入門
Kotlinではじめる Webアプリケーション入門虎の穴 開発室
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 

What's hot (18)

NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Farmnote が技術で牛と人をつなげるまで - Data engineering and data analysis workshop #6
Farmnote が技術で牛と人をつなげるまで - Data engineering and data analysis workshop #6Farmnote が技術で牛と人をつなげるまで - Data engineering and data analysis workshop #6
Farmnote が技術で牛と人をつなげるまで - Data engineering and data analysis workshop #6
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回
 
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
 
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
 
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
 
Rでウォーリを探してみた
Rでウォーリを探してみたRでウォーリを探してみた
Rでウォーリを探してみた
 
Jiro And Database Spsm0922
Jiro And Database Spsm0922Jiro And Database Spsm0922
Jiro And Database Spsm0922
 
Gensim
GensimGensim
Gensim
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめ
 
二階堂愛と二階堂藍の違いについて
二階堂愛と二階堂藍の違いについて二階堂愛と二階堂藍の違いについて
二階堂愛と二階堂藍の違いについて
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
Juliaを使った機械学習
Juliaを使った機械学習Juliaを使った機械学習
Juliaを使った機械学習
 
Kotlinではじめる Webアプリケーション入門
Kotlinではじめる Webアプリケーション入門Kotlinではじめる Webアプリケーション入門
Kotlinではじめる Webアプリケーション入門
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 

Similar to 【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ

【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた
【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた
【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた虎の穴 開発室
 
RustでWebブロック崩し作ってみた
RustでWebブロック崩し作ってみたRustでWebブロック崩し作ってみた
RustでWebブロック崩し作ってみた虎の穴 開発室
 
【とらのあな主催】オタクがKotlinを追うライトニングトークイベント
【とらのあな主催】オタクがKotlinを追うライトニングトークイベント【とらのあな主催】オタクがKotlinを追うライトニングトークイベント
【とらのあな主催】オタクがKotlinを追うライトニングトークイベント虎の穴 開発室
 
Alexaの電卓スキルを作ってみる
Alexaの電卓スキルを作ってみるAlexaの電卓スキルを作ってみる
Alexaの電卓スキルを作ってみる虎の穴 開発室
 
サーバサイドKotlinへの入門 Ktor編
サーバサイドKotlinへの入門 Ktor編サーバサイドKotlinへの入門 Ktor編
サーバサイドKotlinへの入門 Ktor編虎の穴 開発室
 
AWS Elemental MediaConvert で動画変換
AWS Elemental MediaConvert で動画変換AWS Elemental MediaConvert で動画変換
AWS Elemental MediaConvert で動画変換虎の穴 開発室
 

Similar to 【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ (6)

【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた
【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた
【とらラボLT】アニメ視聴状況を管理するWebページを作ってみた
 
RustでWebブロック崩し作ってみた
RustでWebブロック崩し作ってみたRustでWebブロック崩し作ってみた
RustでWebブロック崩し作ってみた
 
【とらのあな主催】オタクがKotlinを追うライトニングトークイベント
【とらのあな主催】オタクがKotlinを追うライトニングトークイベント【とらのあな主催】オタクがKotlinを追うライトニングトークイベント
【とらのあな主催】オタクがKotlinを追うライトニングトークイベント
 
Alexaの電卓スキルを作ってみる
Alexaの電卓スキルを作ってみるAlexaの電卓スキルを作ってみる
Alexaの電卓スキルを作ってみる
 
サーバサイドKotlinへの入門 Ktor編
サーバサイドKotlinへの入門 Ktor編サーバサイドKotlinへの入門 Ktor編
サーバサイドKotlinへの入門 Ktor編
 
AWS Elemental MediaConvert で動画変換
AWS Elemental MediaConvert で動画変換AWS Elemental MediaConvert で動画変換
AWS Elemental MediaConvert で動画変換
 

More from 虎の穴 開発室

Railsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認するRailsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認する虎の穴 開発室
 
虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴 開発室
 
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdfDeno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf虎の穴 開発室
 
toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明虎の穴 開発室
 
Deno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介しますDeno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介します虎の穴 開発室
 
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –虎の穴 開発室
 
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと虎の穴 開発室
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」虎の穴 開発室
 
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!虎の穴 開発室
 
セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説虎の穴 開発室
 
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発虎の穴 開発室
 
Amplify Studioを使ってみた
Amplify Studioを使ってみたAmplify Studioを使ってみた
Amplify Studioを使ってみた虎の穴 開発室
 
いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!虎の穴 開発室
 
【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ虎の穴 開発室
 
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について虎の穴 開発室
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜 虎の穴 開発室
 
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント 虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント 虎の穴 開発室
 

More from 虎の穴 開発室 (20)

FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化
 
Railsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認するRailsのデバッグ どうやるかを改めて確認する
Railsのデバッグ どうやるかを改めて確認する
 
虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf
 
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdfDeno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
Deno Deployと組み合わせるのに Upstashをおすすめしたい.pdf
 
toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明toranoana.deno #6 アジェンダ 採用説明
toranoana.deno #6 アジェンダ 採用説明
 
Deno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介しますDeno 向け WEB 開発用のツールを作ったので 紹介します
Deno 向け WEB 開発用のツールを作ったので 紹介します
 
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
Supabase Edge Functions と Netlify Edge Functions を使ってみる – 機能とその比較 –
 
GCPの画像認識APIの紹介
GCPの画像認識APIの紹介 GCPの画像認識APIの紹介
GCPの画像認識APIの紹介
 
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
【エンジニアの勉強法ハックLT- vol.7】ゲームから学んだ勉強のこと
 
GitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼうGitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼう
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」
 
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
社内DX推進!非エンジニア向けにプログラミング講座を実施してみた!
 
セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説セキュリティを強化しよう!CloudArmorの機能解説
セキュリティを強化しよう!CloudArmorの機能解説
 
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発JavaScript LT会 〜 React.js   Node.js歓迎 〜 Deno で やってみるweb開発
JavaScript LT会 〜 React.js Node.js歓迎 〜 Deno で やってみるweb開発
 
Amplify Studioを使ってみた
Amplify Studioを使ってみたAmplify Studioを使ってみた
Amplify Studioを使ってみた
 
いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!いいテスト会 (スプリントレビュー) をやろう!
いいテスト会 (スプリントレビュー) をやろう!
 
【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ【Saitama.js】Denoのすすめ
【Saitama.js】Denoのすすめ
 
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
虎の穴ラボ Tech day#3 チームで戦う!とらのあな通販冬の大感謝祭でのフロント開発について
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
 
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント 虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
虎の穴ラボ TechDay#3 フルリモート率100%!リモートワークを可能にするマネージメント
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (8)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

【20190319 KotlinLT】Kotlinで雑に作るLispインタープリタ

  • 1. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. Kotlinで雑に作るLispインタープリタ 虎の穴ラボ 藤原 佳顕 1 2019.03.19 オタクがKotlinを追うライトニングトークイベント
  • 2. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. アジェンダ • 自己紹介 • はじめに • 動機 • Lispの軽い説明 • 字句解析編 • 構文解析編 • eval編 2
  • 3. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. 自己紹介 (hash-map :name "藤原 佳顕(28)" :desc "にわかLisperかつフロントエンドマン" :work "Fantiaでフロント周りを中心に色々" :like (hash-map :game '("レイストーム" "ダライアス外伝") :anime '("スクライド" "Show By Rock") :tech '("Clojure" "TypeScript"))) 3
  • 4. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. はじめに • Kotlinの勉強がてら簡単なLispを(雑に) 実装してみているので紹介します。 • 本LTには以下の要素が含まれます – Any型 – null安全の破壊 – 安全じゃないキャスト 4
  • 5. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. • 言語を勉強するときはなにか作りたい! – Webアプリはフレームワークも知らないとつらい・・・ – ほぼ素のKotlinで書けるCUIアプリにしよう! • Lisp方言をちょっと触っていたこともあり実装が簡単そうなLispイン タープリターの実装を通してKotlinの文法などを知ろう!というモチ ベーション 5 動機
  • 6. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. Lispの軽い説明 突然ですがみなさん・・・ Lispってご存知でしょうか? 6
  • 7. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. Lispの軽い説明 Lispのよく聞くイメージ • かっこが多い(+ 1 (- 9 ( * (/ 2 5) (+ 1 29)))) • 変態が使う言語 • エイリアン 7
  • 8. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. Lispの軽い説明 Lispは(拡張がなければ)文法が簡単!! • 基本的にはカッコと予約語だけ(S式) • 今回は時間と紙面の都合で以下の中でも四則演算と比較演算子、ifが実行で きるまで実装します (+ 1 (- 100 99)) ;;=> 四則演算 1 + (100 - 99) = 2 (= 1 1) ;;=> true (> 1 1) ;;=> false (< 1 1) ;;=> false (if (= 1 1) "True" "False") ;; 特殊形式ifの例 8
  • 9. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. 字句解析 今回は雑に作るので、手抜きします。 ※“(+ 1 1)” → [“(“, “+”, “1”, “1”, “)”]に分解しているだけ 9 const val LEFT_BRACES = "(" const val RIGHT_BRACES = ")" const val SPACE = " " // 文字列を空白でパースしてトークンのリストに変換 fun tokenize(line: String): List<String> = line.replace(LEFT_BRACES, "$SPACE$LEFT_BRACES$SPACE") .replace(RIGHT_BRACES, "$SPACE$RIGHT_BRACES$SPACE") .split(SPACE).map { it.trim() }.filterNot { it.isBlank() }
  • 10. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. 字句解析(テスト) 10 describe("tokenizeを呼んだ時") { it("文字列が入力された場合文字列のリストが生成される") { assertEquals(listOf("(", "+", "1", "1", ")"), tokenize("(+ 1 1)")) } it("入れ子のカッコの場合") { assertEquals(listOf("(", "+", "1", "(", "*", "3", "10", ")", ")"), tokenize("(+ 1 (* 3 10))")) } context("S式として不正な場合でもトークン化は正常に終わること") { it("左括弧が無い") { assertEquals(listOf("+", "1", "1", ")"), tokenize("+ 1 1)")) } it("右括弧が無い") { assertEquals(listOf("(", "+", "1", "1"), tokenize("(+ 1 1")) } it("カッコの対応が不正") { assertEquals(listOf("(", "+", "1", "*", "3", "10", ")", ")"), tokenize("(+ 1 * 3 10))")) } } }
  • 11. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. 構文解析 Lispのプログラムの形をよく見ると・・・ (+ 1 (- 100 99)) プログラム自体が再帰構造になっている!! ⇛しかし…Javaは末尾再帰最適化してくれないらしい 11 外側の括弧の演算 内側の括弧の演算
  • 12. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. 構文解析(データ構造 データ構造自体も再帰構造とします 12 class Cell(val parent: Atom<out Any>, val children: MutableList<Cell>) {} 関数とか特殊形式とかを表したもの 引数リストとか。型を自分自身に することで括弧の入れ子対応を考 えない 出力イメージ: [“+”, 1, [“-”, 100 99]] parent parentchildren children
  • 13. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. 構文解析(ロジック) tailrec fun read(tokens: List<String>, cell: Cell? = null, braceStack: List<Cell> = listOf()): Cell? { // 中身省略 } 13 末尾再帰するためのキーワード
  • 14. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. 構文解析(ロジック) 14 DECOMPILEしてみた(Kotlin→バイトコード→Java) @Nullable public static final Cell read(@NotNull List tokens, @Nullable Cell cell, @NotNull List braceStack) { while(true) { // 中身省略 if (tokens.isEmpty()) { // 全トークンが処理完了したら終わり Collection var19 = (Collection)braceStack; if (!var19.isEmpty()) { throw (Throwable)(new BraceError("( is not found")); } return cell; } // 以降も省略 } } 再帰がループに置き換えられている!!
  • 15. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. 15 !!WARNING!! ここから先は以下の要素が含まれます。 ● Any型の乱用 ● なんの保証もないキャスト ● null安全の崩壊
  • 16. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. eval編(準備) 16 構文解析はできたので次は評価をしよう!まずは組み込み関数から // TODO: lambda.refrect()メソッドから生成される KFunctionとcallメソッドを使いたかった // が、KFunction自体がexperimental fun initEnv(): Env { //Envの実体はKeyが文字でValueがラムダ式(Anyにしちゃってますが )のHashMap val env = Env() env.put("+") { args: List<Any>? -> args!!.fold(0) { acc, number -> acc + (number as Int) } } // 略 env.put(">") { args: List<Any>? -> (1..(args!!.size - 1)).map { Pair(args[it - 1], args[it]) }.all { (it.first as Int) > (it.second as Int) } } // 略 return env }
  • 17. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. eval編(実行) 17 Cellクラスのevalメソッドを呼びます。 fun eval(env: Env): Any? { return when (parent) { // 各シンボルに対して自身が持つevalメソッドを呼び出していく is Symbol -> parent.eval(env)?.invoke( // 引数の評価はchildrenのevalを呼び出す。(実質)再帰になっている children.map {elem -> elem.eval(env)!!} ) is If -> parent.eval(env)?.invoke(children) is Num -> parent.eval() is Str -> parent.eval() else -> null } }
  • 18. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. デモ 18 (REPL起動)
  • 19. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Copyright © 2019 Toranoana Inc. All Rights Reserved. まとめ • KotlinでLispの各種演算とifを実装することができました • 感じたメリット – 再帰処理などはJavaに比べて書きやすい – 関数についてもラムダ式で直感的に書ける • 今後:関数定義あたりまではやりたいと思っています • 型をあえてつけてほしくない場合の処理がイマイチ – sealedクラスとか使いこなせば・・・ • KFunctionはよ・・・ 19