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
Continuations in Ruby
Search
Antono Vasiljev
June 17, 2012
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Continuations in Ruby
Antono Vasiljev
June 17, 2012
More Decks by Antono Vasiljev
See All by Antono Vasiljev
Node.js Overview
antono
1
330
Cucumber
antono
1
340
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
300
Side Projects
sachag
455
43k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
530
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
480
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
480
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
360
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
220
Transcript
Continuations in Ruby Antono Vasiljev Ruby Open Air, 2012
Continuation is basically Rest of the program
Continuations are first class objects in Ruby
irb(main)> c = callcc { |cont| cont } => #<Continuation:0x7f70ad16d030>
Continuations are about Flow Control
1: i = 0 2: callcc do |cont| 3: i
= 1 4: cont.call 5: i = 2 # skipped 6: end 7: 8: # i => 1
1: i = 0 2: i = callcc do |cont|
3: i = 1 4: cont.call(2) 5: i = 3 # skipped 6: end 7: 8: # i => 2 # See lines: 2, 4
1| i = 0 2| 3| label :sum 4| 5|
puts i += 1 6| 7| goto :sum, cond: (i < 10)
1| LABELS = {} 2| 3| def label(name) 4| callcc
{ |cont| LABELS[name] = cont } 5| end 6| 7| def goto(label, args: {}) 8| LABELS[label].call if args[:cond] 9| end
Continuation are like goto with parameters (but jumps only backward)
continuations jumps far def foo bar end def bar baz
end def baz $cont[0] end callcc { |c| $cont = c; foo }
Similar to exceptions. But can go down through stack. Time
Machine!
Restartable Exceptions
1| begin 2| hello 3| rescue Exception => e 4|
e.restart 5| ensure 6| e.cleanup 7| end
1| def hello 3| i = 0 4| restartable do
5| puts i += 1 6| raise Exception unless i == 5 7| end 8| end
1| def restartable 2| cont = callcc { |c| c
} 3| begin 4| yield 5| rescue Exception => e 6| e.continuation = cont 7| raise e 8| end 9| end
require 'continuation' class Exception class << self attr_accessor :conts end
def continuation=(cont) self.class.conts ||= {} self.class.conts[self.class] ||= cont end
def restart self.class.conts[self.class].call end def cleanup self.class.conts.delete(self.class) end end
You can do with continuation: Generator objects Fibers/Coroutines Exit from
recursion Other control structures
Thanks!
http://antono.info/