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