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 ", "