Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Gore: A Tale of Go REPL
Search
motemen
June 21, 2015
Programming
6.3k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Gore: A Tale of Go REPL
Go Conference Summer 2015
motemen
June 21, 2015
More Decks by motemen
See All by motemen
旧から新へ: 大規模ウェブクローラの Perl から Go への移行 / YAPC::Fukuoka 2025
motemen
3
2.5k
AIに実況させる / AI Streamer
motemen
4
8.6k
技術を育てる組織・組織を育てる技術 / technology and organization
motemen
13
5.3k
はてなのエンジニアリングマネジメント、これまでとこれから / Engineering Management in Hatena, Hatena Engineer Seminar 26
motemen
2
2.3k
入門 Bubble Tea
motemen
1
1k
ソフトウェア開発と私 / Software Development and I
motemen
13
7k
はてなサービスプラットフォームチームにおける Mackerel / Mackerel in Hatena Platform Team
motemen
1
1.4k
はてなシステムの考古学 / History of development at Hatena
motemen
3
300k
Reading Go Tools - GoCon 2016 Spring
motemen
5
2.9k
Other Decks in Programming
See All in Programming
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
3.9k
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
990
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
810
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
残高管理から台帳サービスへの進化
artoy
1
200
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
2.5k
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
Featured
See All Featured
Fireside Chat
paigeccino
43
4.1k
Code Review Best Practice
trishagee
74
20k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Paper Plane
katiecoart
PRO
5
54k
Designing Powerful Visuals for Engaging Learning
tmiket
1
610
Prompt Engineering for Job Search
mfonobong
0
520
Darren the Foodie - Storyboard
khoart
PRO
4
4k
My Coaching Mixtape
mlcsv
0
360
Art, The Web, and Tiny UX
lynnandtonic
304
22k
A Soul's Torment
seathinner
8
3.8k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
Transcript
A Tale of Go REPL motemen Go Conference 2015 Summer
@ Tokyo
About Me - @motemen - Web engineer - Chief engineer
at Hatena, Kyoto
Mackerel mackerel.io
Agenda - Introduction of ! motemen/gore - Gore’s architecture -
Implementation details
Gore /gɔː/
Case: Learning New Languages - Playing with language features -
Trying libraries
My Case — Perl - perl ~/sketch.pl - Edit and
Run
My Case — Ruby - irb - pry - A
“REPL” (Read-Eval-Print-Loop)
My Case — Go? - tmp.go - “packge main” “func
main()” - Removing unused variables by hand - Question: Can gophers haz a REPL?
Go "REPL" impls (AFAIK) - ! sbinet/igo — built upon
! sbinet/go-eval, with liner - ! emicklei/rango — importing, statements, listing variables - ! vito/go-repl — importing, statements, useful commands - ! d4l3k/go-pry — attaches to running program, uses reflection - (play.golang.org)
Needed a REPL that: - Evaluates statements - Imports any
module - Pretty prints values automatically - Completes code
The Difficulties - How can we achieve Go semantics? -
No APIs provided - Re-implement Go compiler?
Solution: “go run”
Solution: “go run” - An “eval” to Go - Perfect
implementation & Always up-to-date - Dead simple - In: a program Out: the result
Gore: A REPL using “go run” go get github.com/motemen/gore
Caveats - Gore runs all code input for each run
- Code with side effects will be repeated - eg. Printing output / Sleeping
Stories Inside Gore
Overview: not a “REPL” exactly - REPL: Read-Eval-Print-Loop - No
“Eval” and “Print” phase - As we do them by “go run” - Much like: Read-Generate-Run-Loop
Read-Gen-Run-Loop 1. Read user input to evaluate 2. Generate a
.go file that prints result 3. “go run” it 4. Back to 1.
Step: Read - Codes go under AST (abstract syntax tree)
form - Syntax checking - Easier to manipulate - Input String → AST → .go → “go run”
Read: Input - ! peterh/liner - Line editing - History
- Supports Windows
Read: Input to AST - package go/parser - Go has
rich support for parsing/typing its code - Easy to generate & manipulate
Read: Input to AST - Parse input as an expression
- If failed: a statement - Otherwise: continue input (multi-line)
Read: Expression - Easy - Dedicated API - parser.ParseExpr(in)
Read: Statements - $ func (s *Session) evalStmt(in string) error
{ src := fmt.Sprintf("package P; func F() { %s }", in) f, err := parser.ParseFile(s.Fset, "stmt.go", src, 0) if err != nil { return err } enclosingFunc := f.Scope.Lookup("F").Decl. (*ast.FuncDecl) stmts := enclosingFunc.Body.List }
Generate: The Delicious Part - Append the input AST nodes
to our main() - Add the code to print the value
Printing Values - The generated program prints values (not gore)
- “New Values” should be printed - Expression: Its resulting value - Statement: Values assigned
Printing Values: Expression - User: foo.Bar(a+1) - Gore: __gore_p(foo.Bar(a+1))
Printing Values: Statements - ast.AssignStmt stands for assign/define - User:
a, b := foo() - Gore: a, b := foo(); __gore_p(a, b)
Printing Values: __gore_p() - “Pretty prints” values - Defined along
with the main() - Depends on installed packages - ! k0kubun/pp, ! davecgh/go-spew or plain old %#v
The Initial .go File (pp) package main import "github.com/k0kubun/pp" func
__gore_p(xx ...interface{}) { for _, x := range xx { pp.Println(x) } } func main() { // User input goes here }
The Initial .go File (go-spew) package main import "github.com/davecgh/go-spew/spew" func
__gore_p(xx ...interface{}) { for _, x := range xx { spew.Printf("%#v\n", x) } } func main() { // User input goes here }
The Initial .go File (%#v) package main import "fmt" func
__gore_p(xx ...interface{}) { for _, x := range xx { fmt.Printf("%#v\n", x) } } func main() { // User input goes here }
Generate: Append to main() - Just append those generated statements
s.mainBody.List = append(s.mainBody.List, stmts…) - Now we’ve got the working code! - Really? No! %
Go compiler complaints (you know) - “x declared but not
used” - “p imported but not used” - “no new variables of left side of :=“ - & Should remove these to a successful go run
Quick Fixing Erroneous Program - “x declared but not used”
- “p imported but not used” - “no new variables on left side of :=“ Use it!! Anonymize it!! Make it `=‘ !!
“declared but not used” package P func main() { s
:= "hello" } package P func main() { s := "hello" _ = s }
”imported but not used” package P import "fmt" func main()
{ } package P import _ "fmt" func main() { }
“no new variables on left side of :=“ package P
func main() { var a int a := 1 } package P func main() { var a int a = 1 }
! motemen/go-quickfix to do the work - Type check source
code using go/types.Check() - Catch errors and modify AST - Packed with a bin - goquickfix -w main.go
Gore specific quickfix - __gore_p() for non-value expressions
Running - Output the AST to file — go/printer -
Then go run - If failed to run, revert the last input
Recap: Read-Gen-Quickfix-Run-Loop 1. Read and parse the input to obtain
AST 2. Add printing function call __gore_p() 3. Append the code to main() 4. Quickfix it so that it compiles well 5. go run
PRs welcome! - ! motemen/gore - ! motemen/go-quickfix
htn.to/intern2015
A Tale Gore motemen Go Conference 2015 Summer @ Tokyo
Appendix: More Features
Code Completion - liner has support for completion - Great
tool for editors: ! nsf/gocode - Server/client model - And an interface to it: motemen/gore/gocode - If gocode binary can be located, use it
Commands - :print - :write <file> - :import <pkg> -
:doc <expr>
:import <pkg> - Imports arbitrary packages - Just append import
statement to the file - Unused imports are handled by quickfix
:doc <expr> - Invokes go doc for given expression -
Package: :doc json - Function: :doc json.Marshal - Method: :doc json.NewEncoder().Encode