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
Continuation is to be continued
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Masayuki Mizuno
April 22, 2025
2.2k
1
Share
Continuation is to be continued
Masayuki Mizuno
April 22, 2025
More Decks by Masayuki Mizuno
See All by Masayuki Mizuno
Rails アプリの docker build を 倍速にした話
fetburner
2
170
Omotesando.rb #110
fetburner
0
200
callccの実装を読む
fetburner
0
230
RubyでSlackのbotを作ろう
fetburner
0
200
継続オペレータの話
fetburner
0
270
Rubyでリストモナドを使う
fetburner
0
210
次世代のプロファイラVernierを試す
fetburner
0
150
数値計算とメモリ最適化
fetburner
0
290
3/14なので円周率を計算する
fetburner
0
490
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8.2k
The untapped power of vector embeddings
frankvandijk
2
1.7k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
580
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Building the Perfect Custom Keyboard
takai
2
780
How STYLIGHT went responsive
nonsquared
100
6.1k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
260
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Git: the NoSQL Database
bkeepers
PRO
432
67k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
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