irb = interactive Ruby

fc9 [1] /root # irb
irb(main):002:0> def add(x,y) x+y end
=> nil
irb(main):003:0> def mul(x,y) x*y end
=> nil
irb(main):004:0> add(2,3)
=> 5
irb(main):005:0> mul(2,3)
=> 6
irb(main):006:0>
irb(main):012:0> calc=lambda { |x| send(x,2,3) } #無名関数をcalcにbind。
=> #<Proc:0xb7e8eb28@(irb):12>
irb(main):013:0> calc.call("add")
=> 5
irb(main):014:0> calc.call("mul")
=> 6
#うーん。でもこれは"add"文字列渡してるだけなのでschemeの例と違うな。。procを渡さないと。。
irb(main):015:0>

# ↓こっちが正解だな多分。。
irb(main):033:0> add=lambda {|x,y| x + y}
=> #<Proc:0xb7eedaec@(irb):33>
irb(main):034:0> mul=lambda {|x,y| x * y}
=> #<Proc:0xb7ededbc@(irb):34>
irb(main):035:0> add.call(2,3)
=> 5
irb(main):036:0> mul.call(2,3)
=> 6
irb(main):037:0> def calc(x,y,&f) f.call(x,y) end
=> nil
irb(main):039:0> calc(2,3,&add)
=> 5
irb(main):040:0> calc(2,3,&mul)
=> 6
irb(main):041:0> calc(2,7,&mul)
=> 14
irb(main):042:0>

irb(main):026:0> def add(x) return lambda {|y| x + y} end # 関数を返す関数add
=> nil
irb(main):027:0> add(9)
=> #<Proc:0xb7e9b9cc@(irb):26>
irb(main):028:0> add(9).call(10)
=> 19
irb(main):029:0> add_10=add(10)
=> #<Proc:0xb7e9b9cc@(irb):26>
irb(main):030:0> add_10.class
=> Proc
irb(main):031:0> add_10.call(2)
=> 12
irb(main):032:0>