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
100
Golangで小さなLispインタプリタを作ってみた
昔の社内勉強会で作ったスライド。GitPitchが閉鎖してたため移行。
Takuro Niitsuma
December 25, 2017
Tweet
Share
More Decks by Takuro Niitsuma
See All by Takuro Niitsuma
NAISTへの道
otakumesi
2
1.2k
Reactでライフゲームを作ってみた話
otakumesi
0
77
Other Decks in Programming
See All in Programming
Cloud Adoption Frameworkにみる組織とクラウド導入戦略(縮小版)
tomokusaba
1
180
"Swarming" をコンセプトに掲げるアジャイルチームのベストプラクティス
boykush
2
230
型付きで行うVSCode拡張機能開発 / VSCode Meetup #31
mazrean
0
240
個人開発で使ってるやつを紹介する回
yohfee
1
690
ACES Meet におけるリリース作業改善の取り組み
fukucheee
0
130
Rails 8 Frontend: 10 commandments & 7 deadly sins in 2025
yshmarov
1
620
CSC509 Lecture 02
javiergs
PRO
0
160
"noncopyable types" の使いどころについて考えてみた
andpad
0
140
.NET Aspireのクラウド対応検証: Azureと他環境での実践
ymd65536
1
410
tsconfig.jsonの最近の新機能 ファイルパス編
uhyo
6
1.6k
Removing Corepack
yosuke_furukawa
PRO
9
1.2k
[PHPカンファレンス沖縄2024]「無理なくできるだけ安全に」テストもないレガシーコードをリファクタリングするテクニック
ikezoemakoto
3
120
Featured
See All Featured
Fireside Chat
paigeccino
32
3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
22k
Code Review Best Practice
trishagee
62
16k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Writing Fast Ruby
sferik
626
60k
The Pragmatic Product Professional
lauravandoore
31
6.2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
3
230
Designing on Purpose - Digital PM Summit 2013
jponch
114
6.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.3k
Building an army of robots
kneath
302
42k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
29
1.7k
Embracing the Ebb and Flow
colly
84
4.4k
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さんに、 こんなコメントを貰えたので僕は満足しました
終わり