Presentation #16
Download
Report
Transcript Presentation #16
Code Blocks, Closures, and
Continuations
Presented by: Bassem ELkarablieh
Outline
Getting Started with ruby
Some ruby syntax
Ruby classes
More ruby syntax
New concepts in ruby
Getting Started
Ruby is a dynamic, fully objectoriented scripting language.
Installing ruby:
http://www.ruby-lang.org
One click windows installation (takes 5
min to setup ruby)
Running ruby
Interactive ruby (irb)
Batch ruby (run program files)
Getting Started
Ruby documentation
http://www.ruby-doc.org
Using the ri tool
What did we learn
Some ruby Syntax
Ruby is fully OO
Every thing is an object (even literals)
“hello”.length
“bassem”.index(“e”)
-88.abs
Variable definition
Number = 5
Number = “5”
Number = “five”
Delimiters: no ending ”;” is required
Some ruby Syntax
Simple I/O
Puts: write the value to the output with new line
character appended
Gets: reads the value from standard input
A = gets
puts “Hello I am “ + A
Conditions
If else blocks
If A>8
puts “greater”
Else
Puts “smaller”
end
Some ruby Syntax
Looping
While block
While line = gets
Puts line.uppercase
End
For … In blocks
For I in 1..7
Print I, “ “
Control structures
Break, redo, next , retry
Some ruby Syntax
Assignment
a = b = 1+2+3
Instrument = “piano”
Instrument [“ano”] = “ccolo”
Parallel Assignment
a,b = 6,7
Method definition
def my_method(arg1,arg2,arg3)
#this is a comment and code
Def
What did we learn
Classes in Ruby
Initializer
Instance variable
Class variables
Instance methods
Class methods
Attributes
operators
Access controls
Classes in ruby
Demo of a class
More ruby syntax
Containers
Code blocks
Iterators
Containers
Arrays
A= [56,”hello”,99.66,”ll”]
B=Array.new
Un-initialized members of an array are
set to nil
Indexing an array
A[0] ->56 , A[-1] =“ll”
A[1,1] ->[“hello”]
A[0..2]-> [56,”hello”,99.66]
Containers
Hashes
H ={‘dog’=>’canine’, ‘cat’
=> ’feline’, ’bird’ => ‘duck’}
H.length => 3, h[‘dog’] =>’canine’
H[12] = ‘hello’, H[‘cat’] =99
Code Blocks
Chucks of code that can be associated
with method invocations
Great methods for implementing
callbacks
Great tool for implementing iterators
Code blocks are flexible , and can be
passed parameters
Great tool for implementing closures
and continuations
Code Blocks
Code block can be stored between{} or between
do…end blocks
Def my_method
puts “hello”
yield
yield
End
my_method{puts “world”}
Code block parameters differ from method parameters
Def say_goodnight(name)
puts “good night, #{name}”
Yield (“sweet dreams”)
End
Say_goodnight(“bassem”){|i| print i}
Iterators
Built in iterators in ruby uses code block to
support general plug-in architecture
Examples
5.times{print “*”}
3.upto(6) {|i| print i}
(‘a’..’z’).each{|char| print char}
[‘cat’,’dog’,’horse’].each{|name| print name}
[1,3,5,7,9].find{|v| v*v>3}
[“H”,”A”,”L”].collect{|x| x.succ}
[1,3,5,7].inject(0){|sum,element| sum+element}
New concepts in ruby
Closures
Continuations
Dynamic manipulations
Closures
A closure is a function created by a
program at run time. This idea is written as
a function that appears entirely within the
body of another function. The nested, inner
function may refer to local variables of the
outer function.
A closure can be used to represent a
delayed user defined behavior that can be
passed around in methods and objects
Closures
Closure simulations
C: function pointers, void* parameters
C++: Functors
C# and java: Anonymous classes and
methods
Ruby have a special built-in Proc class
that simplifies implementing closures
Proc Class
Proc objects are blocks of code that have been bound
to a set of local variables, once bound the code can be
called from different context.
Example:
Def gen_times(factor)
return Proc.new{|n| n*factor}
End
Times3 = gen_times(3)
Times5 = gen_times(5)
Times3.call(12)
Times5.call(3)
Times3.call(times5.call(4))
Proc Objects
Proc objects can be created by
associating a code block with it
Example
Def proc_from
Proc.new
End
Proc = proc_from{“hello”}
Proc.call
Code blocks as closures
Example1
Def n_times (thing)
Return lambda {|n| thing*n}
End
# here lambda returns a Proc object associated
with the code block
P1 = n_times(23)
P1.call(3)
P2 = n_times(“hello”)
P2.call(4)
Code blocks as closures
Example2
Songlist = SongList.new
Class JukeboxButton<Button
Def initialize(label,&action)
Super(label)
@action = action
End
Def button_pressd
@action.call(self)
End
End
Start_button = JukeboxButton.new(“start”){songlist.start}
pause_button =
JukeboxButton.new(“pause”){songlist.pause}
Continuations
Continuations are objects that lets
you save system state, and then
return to that state on command
Code blocks defines the universe in a
continuation
Continuations
A continuation object saves the
execution state( mainly the execution
stack)
A continuation is created using a call
to a Kernel method “callcc” which
associates a continuation to a code
block
Similar to Proc object , continuations
are triggered using a “call” method
Callcc method
Generates a continuation object ,
which it passes to the associated
block
Performing a cont.call will use the
callcc to return
The value returned by callcc is the
value of the block or the value passed
to cont.call
Continuations
Example1
Calloc do|cont|
For i in 0..4
print “\n#{i}:”
for j in i*5 … (i+1)*5
cont.call() if (j==7)
print j
end
End
End
Continuation Objects
Callcc return values implicitly
Callcc{|cont| cont.call}
Callcc{|cont| cont.call 1}
Callcc{|cont| cont.call 1,2,3}
Callcc return values Explicitly
Callcc{|cont| return cont}
Continuations
Example2
Def strange
calloc {|cont| return cont}
print “back to method”
End
Print “before method”
Temp = strange()
Print “after method”
If( Temp) Temp.call
Continuations
Example3
1. Def loop
2. for i in 1..5
3.
puts I
4.
callcc{|cont| return cont} if i==2
5. end
6. return nil
7. End
8. Puts “before loop”
9. Temp = loop()
10.Puts “after loop call”
11.If( Temp) Temp.call
12.Puts “after continuation call”
Done
Final demo
Any Questions
What's next in ruby
Ruby types
Ruby methods
Ruby Expressions