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
Continuations in Ruby
Search
Antono Vasiljev
June 17, 2012
150
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
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Claude Code のすすめ
schroneko
67
230k
Un-Boring Meetings
codingconduct
0
490
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.6k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
760
Become a Pro
speakerdeck
PRO
31
6.3k
Product Roadmaps are Hard
iamctodd
55
13k
Prompt Engineering for Job Search
mfonobong
0
570
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
680
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
590
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/