From: Christoph Rippel Date: 2001-02-24T12:46:09+09:00 Subject: [ruby-talk:11423] Re: binding to callers namespace. Hi, I came up with the following example when playing around with ``suspendable functions'' - not exactly what you want but related ... the output is $ ruby -w FibProc.rb 1, 1, 2, 3, 5 5, 3, 2, 1, 1 "alt_re_initialize" 1, -2, -1, -3, -4 -4, -3, -1, -2, 1 2, 2, 4, 6, 10 "context does Not change" 16, 26, 42, 68, 110 -------------------- class Context # maybe include Singleton attr_accessor :tmp, :a, :b def initialize # we must create context variables @tmp = @a = @b =1 end def create_context_bound_fib fp = FibProc::new { || \ @tmp = @a; @a = @b; @b += @tmp; @tmp } fp.context = self return fp end def create_context_bound_rev_fib fp = FibProc::new { || \ @tmp = @b; @b = @a; @a = @tmp - @a; @a } fp.context = self return fp end attr_accessor :curr_fp def standard_initialize @tmp = @a = @b =1 end def alt_initialize @tmp = @a = 1; @b = -2 end end class FibProc < Proc # should be attr_reader # does Not change attr_accessor :context def standard_re_initialize context.standard_initialize end def alt_re_initialize context.alt_initialize end end cont = Context.new fib = cont.create_context_bound_fib rev_fib = cont.create_context_bound_rev_fib arr = Array.new 5 puts arr.collect! {|| fib.call}.join ", " puts arr.collect! {|| rev_fib.call}.join ", " fib.alt_re_initialize p "alt_re_initialize" puts arr.collect! {|| fib.call}.join ", " puts arr.collect! {|| rev_fib.call}.join ", " fib.context.a = 2 fib.context.b = 2 puts arr.collect! {|| fib.call}.join ", " p "context does Not change" fib.context = Context.new fib.context.a = 2 fib.context.b = 2 puts arr.collect! {|| fib.call}.join ", "