CMSC330

Codeblocks

Codeblocks

Codeblock
Procs
Higher Order Programming

Codeblocks

Codeblocks

Recall the creation of a 3x3 Array


# matrix.rb
a2d = Array.new(3){Array.new(3)}
          

{Array.new(3)} is a codeblock

Let's see what else we can do


# matrix.rb
a2d1 = Array.new(3){Hash.new()}
a2d2 = Array.new(3){|i| i}
          

# matrix.rb
a2d1 = Array.new(3){Hash.new()}
a2d2 = Array.new(3){|i| i}
          

Codeblock: segment of code that another method uses

  • Enclosed in {} or do ... end
  • |..| marks parameters
  • Codeblocks are not objects

Main idea: Code treated as data

How to call codeblock?


# codeblock.rb
def func1
  if block_given?
    yield
  end
end

func1 {puts "hello"}
          

Codeblocks are like in-line functions


# the two are similar
def f yield 5 end
f {|i| y = i + 1; puts y}

def f(i) y = i+1; puts y end
f(5)
          

Control is passed to codeblock like a function call

Control is passed to codeblock like a function call


# codeblock-1.rb
def func2
  if block_given?
    for i in 1..3
      yield i
    end
  end
end
          

Can take arguments like a function call too


def func3
  yield 3,4
end
func3 {|a,b| puts a + b}
          

Procs

Procs make codeblocks into objects


# procs.rb
p = Proc.new {puts "hello"}
          

But have to be called, not yielded to


# procs-1.rb
def func3(p)
  p.call
end
p = Proc.new {puts "hello"}
func3(p)
          

Can be strung together


# procs-2.rb
def say(y)
  t = Proc.new {|x| Proc.new {|z| z+x+y }}  
  return t
end
s = say(2).call(3)
puts s.call(4)
          

Important: Codeblocks and Procs are not the same

Higher Order Programming

Higher Order Programming: Programming that uses functions as values

Higher Order Function: A function that takes in a function as an argument

Mostly seen in functional programming langauges

Here is a sneak peek


let f1 f x = f (x) in f1 (fun x -> x + 2) 12