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
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Navigating Team Friction
lara
192
16k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
270
Discover your Explorer Soul
emna__ayadi
2
1.2k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Being A Developer After 40
akosma
91
590k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
220
Scaling GitHub
holman
464
140k
Done Done
chrislema
186
16k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
880
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
770
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/