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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takuro Niitsuma
December 25, 2017
Programming
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Golangで小さなLispインタプリタを作ってみた
昔の社内勉強会で作ったスライド。GitPitchが閉鎖してたため移行。
Takuro Niitsuma
December 25, 2017
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
120
Reactでライフゲームを作ってみた話
otakumesi
0
160
Other Decks in Programming
See All in Programming
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
740
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
1
490
自分的「カンファレンスの楽しみ方」
syumai
0
190
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
680
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
170
MySQLとPostgreSQLって何が違うの?
akagami
PRO
0
170
ALB ログから Trace を気合で繋げる技術
fohte
7
880
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
640
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
400
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
150
アクセシビリティから考える情報設計
high_g_engineer
0
180
Oxlintはいいぞ(続)
yug1224
1
550
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
720
Building Adaptive Systems
keathley
44
3.2k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
440
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
270
Docker and Python
trallard
47
4.2k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
The Curious Case for Waylosing
cassininazir
1
500
Fireside Chat
paigeccino
42
4k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
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さんに、 こんなコメントを貰えたので僕は満足しました
終わり