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
140
Golangで小さなLispインタプリタを作ってみた
昔の社内勉強会で作ったスライド。GitPitchが閉鎖してたため移行。
Takuro Niitsuma
December 25, 2017
Tweet
Share
More Decks by Takuro Niitsuma
See All by Takuro Niitsuma
ウェブ・ソーシャルメディア論文読み会 - Machine-Made Media: Monitoring the Mobilization of Machine-Generated Articles on Misinformation and Mainstream News Websites
otakumesi
0
64
Reactでライフゲームを作ってみた話
otakumesi
0
110
Other Decks in Programming
See All in Programming
SQL Server ベクトル検索
odashinsuke
0
110
2025/3/18 サービスの成長で生じる幅広いパフォーマンスの問題を、 AIで手軽に解決する
shirahama_x
0
160
requirements with math
moony
0
520
小さく段階的リリースすることで深夜メンテを回避する
mkmk884
2
130
AI Agentを利用したAndroid開発について
yuchan2215
0
210
いまさら聞けない生成AI入門: 「生成AIを高速キャッチアップ」
soh9834
12
3.6k
OUPC2024 Day 1 解説
kowerkoint
0
400
‘무차별 LGTM~👍’만 외치던 우리가 ‘고봉밥 코드 리뷰’를?
hannah0731
0
530
AHC 044 混合整数計画ソルバー解法
kiri8128
0
300
아직도 SOLID 를 '글'로만 알고 계신가요?
sh1mj1
0
360
新卒から4年間、20年もののWebサービスと 向き合って学んだソフトウェア考古学
oguri
7
6.5k
Modern Angular:Renovation for Your Applications @angularDays 2025 Munich
manfredsteyer
PRO
0
130
Featured
See All Featured
Docker and Python
trallard
44
3.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
30k
GraphQLの誤解/rethinking-graphql
sonatard
70
10k
Java REST API Framework Comparison - PWX 2021
mraible
29
8.5k
How to train your dragon (web standard)
notwaldorf
91
5.9k
The Cost Of JavaScript in 2023
addyosmani
48
7.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
177
52k
Gamification - CAS2011
davidbonilla
81
5.2k
RailsConf 2023
tenderlove
29
1k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.4k
A Philosophy of Restraint
colly
203
16k
Git: the NoSQL Database
bkeepers
PRO
429
65k
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さんに、 こんなコメントを貰えたので僕は満足しました
終わり