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
Golangで小さなLispインタプリタを作ってみた
Search
Takuro Niitsuma
December 25, 2017
Programming
0
59
Golangで小さなLispインタプリタを作ってみた
昔の社内勉強会で作ったスライド。GitPitchが閉鎖してたため移行。
Takuro Niitsuma
December 25, 2017
Tweet
Share
More Decks by Takuro Niitsuma
See All by Takuro Niitsuma
NAISTへの道
otakumesi
2
1.1k
Reactでライフゲームを作ってみた話
otakumesi
0
45
Other Decks in Programming
See All in Programming
AppRouter Panel Talk
yosuke_furukawa
PRO
1
470
CREってこういうこと? 体験入社 - 提案資料 - / what-is-cre-trial-employment
shinden
1
520
Snowflakeで眠ったデータを起こそう!
estie
0
140
CA.swift19 恋するAIアプリ開発の裏側
oskmr
0
380
Anthropic Cookbook のおすすめレシピ
schroneko
7
1.2k
禅の心を手に入れよ
eltociear
1
370
DMMプラットフォームがTiDB Cloudを採用した背景
pospome
9
4.2k
try! Swift Tokyo 初参加報告LT
hinakko2
0
240
スキーマ駆動開発による品質とスピードの両立 - 私達は何故、スキーマを書くのか
kentaroutakeda
0
180
Sheets API使ってみた
toshi0383
2
160
初心者のためのRubyKaigi入門/RubyKaigi Introduction
a_matsuda
10
1.5k
Git Rebase
bkuhlmann
11
1.6k
Featured
See All Featured
Happy Clients
brianwarren
92
6.4k
Build The Right Thing And Hit Your Dates
maggiecrowley
25
2k
Agile that works and the tools we love
rasmusluckow
325
20k
The Invisible Side of Design
smashingmag
294
49k
YesSQL, Process and Tooling at Scale
rocio
165
13k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
Mobile First: as difficult as doing things right
swwweet
217
8.6k
Fashionably flexible responsive web design (full day workshop)
malarkey
398
65k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
188
16k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
Ruby is Unlike a Banana
tanoku
96
10k
Faster Mobile Websites
deanohume
300
30k
Transcript
Golangで 小さなLispインタプリタ を作ってみた 0x64物語 Reboot #09 @otakumesi
@otakumesi マッハバイトでエンジニアしてます。
みなさん、木といったらなにを思い浮かべますか?
クリスマスツリー、木構造、二分木、...
Lisp
Lisp カッコが多いとかで敬遠されがちな言語 マスコットキャラのLispエイリアンが可愛い Haskell共和国と戦争中らしい(某書によると) LISt Processorを略した名称に由来
Lispエイリアン
Lispの構文は木構造 簡単なLispのコードを見てみましょう。 (+ (* 1 (+ 3 4)) (- 5
(/ 10 5))) ;; => 10
Lispの構文は木構造 ちゃんとインデントをつけてみてみると、 木構造に見えてきませんか? (+ (* 1 (+ 3 4)) (-
5 (/ 10 5))) ;; => 10
Lispの構文は木構造 Lispの構文のS式はそのまま構文木になります (+ (*1 (+34)) (-5 (/105)));; =>10 + /
\ * - / \ / \ 1 + 5 ÷ / \ / \ 3 4 10 5
GolangでLispを 実装した話
動機 Golangで挑戦できるいい題材を探してた (元)Emacs使いとしての目標の一つだった 0x64物語のお題が「木」だった
デモ(REPL) https://github.com/otakumesi/lispon
最初の発想 「Lispは木構造なので、S式の頂点から要素を再帰的に評価していけば、葉までたどり着いて 結果を返せそう」
ゆるふわなクラス図
反省 初期実装を勢いで書いたため「純LISP」の仕様の確認が遅くなった そして「カッコがいっぱいあるだけでLispじゃなくね?」と気がついて、途中でそ れなりに書き直した 未だにLispの仕様がゆるふわ...... Compositeパターンを意識して書いたらもう少しキレイな設計になった気がする
開発中にGolangに対して思ったこと メソッドオーバーロード欲しい オプション引数欲しい (生粋のGopherさんにマサカリ投げられそう)
引き算された言語機能が欲しいと思うこともあったが... Golangを書いてるとなぜだか心地よくなってきて、そんなことどうでもよくなりました (?)
そして、Golangのオプション引数の解決策が面白くて好きです
オプション引数の代替 FunctionalOptionPatternを使って解決した type Option func(*Sexpr)error func Rhs(rhs Evaler)error { return
func(*Sexpr)error { return s.SetRhs(rhs) } } func NewSexpr(opts ...Option) { ... }
せっかくなのでHTMLを書いてみた
GolangでLispをテンプレートエンジンっぽく使って LambdaからHelloWorldした図(?)
これをツイートしたらmattnさんに、 こんなコメントを貰えたので僕は満足しました
終わり