Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Continuation is to be continued
Search
Masayuki Mizuno
April 22, 2025
1
1.6k
Continuation is to be continued
Masayuki Mizuno
April 22, 2025
Tweet
Share
More Decks by Masayuki Mizuno
See All by Masayuki Mizuno
Omotesando.rb #110
fetburner
0
150
callccの実装を読む
fetburner
0
180
RubyでSlackのbotを作ろう
fetburner
0
170
継続オペレータの話
fetburner
0
240
Rubyでリストモナドを使う
fetburner
0
190
次世代のプロファイラVernierを試す
fetburner
0
130
数値計算とメモリ最適化
fetburner
0
250
3/14なので円周率を計算する
fetburner
0
410
ネットワーク機器の中の OCaml
fetburner
1
740
Featured
See All Featured
The Language of Interfaces
destraynor
162
25k
Producing Creativity
orderedlist
PRO
348
40k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
How to Ace a Technical Interview
jacobian
281
24k
Scaling GitHub
holman
464
140k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Rails Girls Zürich Keynote
gr2m
95
14k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
The Cult of Friendly URLs
andyhume
79
6.7k
Transcript
©2025 Wantedly, Inc. Continuation is to be continued A revisit
of first-class continuations or an invitation to delimited continuations RubyKaigi 2025 Mar 16, 2025 - Masayuki Mizuno
©2025 Wantedly, Inc. .BTBZVLJ.J[VOP "CPVUNF • Backend engineer at Wantedly,
Inc. • Born in Takamatsu City, Kagawa • Programming language lover
©2025 Wantedly, Inc. 1. What is a continuation? 2. Continuations’
use cases: backtracking 3. call/cc’s problem 4. Better alternative: shift/reset 5. Conclusion Agenda
©2025 Wantedly, Inc. 8IBUJTDPOUJOVBUJPO
©2025 Wantedly, Inc. What is a continuation? Computation that receive
the evaluation result Or run-time point in program execution
©2025 Wantedly, Inc. Ruby’s built-in continuation operator: call/cc Call/cc captures
current continuation Kernel.#callcc / Continuation#call behaves like setjmp / longjmp
©2025 Wantedly, Inc. Calling continuation multiple times Continuation can be
invoked arbitrary times However, terminated fiber cannot be called Let's see how call/cc is special, using a DSL as an example
©2025 Wantedly, Inc. $POUJOVBUJPOT`VTFDBTFT CBDLUSBDLJOH
©2025 Wantedly, Inc. $BOXFXSJUFCBDLUSBDLJOHGMVFOUMZ :PVDBOEPJUJO)BTLFMM $POUJOVBUJPOT`VTFDBTFTCBDLUSBDLJOH
©2025 Wantedly, Inc. /BJWFUSBOTMBUJPOMFBETUPDBMMCBDLIFMM 8BOUBNPSFSFTFNCMBODFUP)BTLFMMTPOF $POUJOVBUJPOT`VTFDBTFTCBDLUSBDLJOH
©2025 Wantedly, Inc. .FUBQSPHSBNNJOHBWPJETDBMMCBDLIFMM #VJME"45GPSSFTPMWJOHWBSJBCMFTDPQF *OUSPEVDUJPOPGlEPzTZOUBYMJLF%4-
©2025 Wantedly, Inc. &WFSZTZOUBYOFFETSFJOWFOUJPO 5IF%4-JOUFSQSFUFSIBTUPSFQSPEVDFQSFUUZNVDIFWFSZUIJOH *TTVFPGNFUBQSPHSBNNJOHCBTFEBQQSPBDI
©2025 Wantedly, Inc. *ODPNQBUJCMFWBSJBCMFTDPQF .BOVBMWBSJBCMFQBTTJOHJTSFRVJSFE *TTVFPGNFUBQSPHSBNNJOHCBTFEBQQSPBDI
©2025 Wantedly, Inc. Implementing DSL with call/cc Ruby-level backtracking by
call/cc Thanks to one-pass evaluation, most Ruby expressions are also viable in DSL
©2025 Wantedly, Inc. 1SPCMFNPGDBMMDD
©2025 Wantedly, Inc. Problem of call/cc (1/2) Captures unnecessarily large
code pieces Need call/cc calls in two different places, one for backtracking and one for conclusion
©2025 Wantedly, Inc. 1PPSQFSGPSNBODF DBMMDDCBTFEDPEFCMPBUTVQJONFNPSZBOE$16DPOTVNQUJPO 1SPCMFNPGDBMMDD Let's discover the
cause for performance degradation
©2025 Wantedly, Inc. 5JHIUMZDPVQMFEXJUI7.JOUFSOBMT *NQMFNFOUBUJPOMJFTXJUIJO$3VCZ *OTJEFlDPOUJOVBUJPOzMJCSBSZ
©2025 Wantedly, Inc. 3FDPSETOBQTIPUPG7.TUBUF 4BWF7.TUBDLBOENBSLSVOUJNFQPJOU *NQMFNFOUBUJPOPG,FSOFMDBMMDD
©2025 Wantedly, Inc. %JGGFSFOUJBMTOBQTIPUPG7.TUBDL 3FVTFQSFWJPVT7.TUBDLCBDLVQJGUIFSFJTPOF ,FSOFMDBMMDD`TPQUJNJ[BUJPO
©2025 Wantedly, Inc. 3FTUPSFTTUBDLBOEQFSGPSNlMPOHKNQz *OTJEFPG$POUJOVBUJPODBMM 0WFSBMM DBMMDDEFWPUFTFYFDVUJPOUJNFTUPCBDLVQBOESFTUPSFPGTUBDL
©2025 Wantedly, Inc. #FUUFSBMUFSOBUJWFTIJGUSFTFU
©2025 Wantedly, Inc. shift/reset: yet another continuation operators Captures delimited
code block from shift to reset Unlike call/cc, delimited continuation will go back when reaches reset
©2025 Wantedly, Inc. Implementing “do” syntax like DSL with shift/reset
Delimiting continuation leads to simple code Enumerable#flat_map can be used as is
©2025 Wantedly, Inc. Implementing shift/reset with call/cc shift/reset are reproducible
by call/cc Thread-local variable is needed to record return addresses
©2025 Wantedly, Inc. Benchmarking “do” syntax like DSL with shift/reset
Delimited continuation improves performance Kernel.#callcc’s optimization may be effective for shift/reset implementation
©2025 Wantedly, Inc. Foresight to native shift/reset implementation shift/reset may
provide optimization hints Programmers can specify necessary stack range to the interpreter
©2025 Wantedly, Inc. $PODMVTJPO
©2025 Wantedly, Inc. 1. call/cc can manipulate continuations 2. call/cc
is sometimes suitable for DSL 3. call/cc has some problems • Hard to use for developers • Poor performance 4. shift/reset probably resolve problems of call/cc • I'm going to introduce the new, performant API Conclusion