Ask a Question related to Ruby, Design and Development.
-
Simon Strandgaard #1
continuations and clone problem
This class should convert internal-iterators to external-iterators.
But how do I clone them?
Any advice are deeply appreciated.
--
Simon Strandgaard
server> ruby a.rb
a.rb:28:in `next': undefined method `call' for false:FalseClass (NoMethodError)
from a.rb:28:in `callcc'
from a.rb:28:in `next'
from a.rb:43
server> expand -t2 a.rb
class Object
def deep_clone
Marshal::load(Marshal.dump(self))
end
end
class IteratorContinuation
def initialize(instance, symbol)
@instance = instance
@symbol = symbol
first
end
def first
@value = nil
@resume_where = false
@return_where = Proc.new{}
@instance.method(@symbol).call {|i|
@value = i
callcc{|@resume_where|
@return_where.call
return
}
}
@resume_where = false
@return_where.call
end
def next
callcc{|@return_where| @resume_where.call }
end
def is_done?
@resume_where == false
end
def current
@value
end
end
i1 = IteratorContinuation.new("hello world", :each_byte)
i1.next
i1.next
i1.next
i2 = i1.clone # deep_clone not possible
i2.next
p i1.current
p i2.current
server>
Simon Strandgaard Guest
-
Clone stamp problem
My clone stamp is not working properly. When I Alt/click it looks like it's working but when I stamp it's a dark color, not what I used as a sample.... -
Clone problem
Hi, I've got some problem when cloning a model and a separate animation into a third 3d member... In fact here's what I've got: -file A with... -
Clone problem, samples from "+" instead of my mouse cursor
Using PE 2.0, Win XP I already reset prefernces with cntrl alt shift. I tried cloning with aligned off and on and it doesn't matter. I get... -
Home grown continuations
DISCLAIMER: It has been said that continuations can cause brain damage... I am not liable for any such damage if you read further. I was thinking... -
Throwing exceptions into continuations.
Hi all. I'm playing around with Ruby because I like experimenting with concurrency systems, and found out it has continuations. I'm going to be... -
ts #2
Re: continuations and clone problem
>>>>> "S" == Simon Strandgaard <neoneye@adslhome.dk> writes:
Try this (not tested)
S> class IteratorContinuation
def marshal_dump
[@instance, @symbol]
end
def marshal_load(arr)
initialize(*arr)
end
S> end
S> i1 = IteratorContinuation.new("hello world", :each_byte)
S> i1.next
S> i1.next
S> i1.next
S> i2 = i1.clone # deep_clone not possible
i2 = i1.deep_clone
S> i2.next
S> p i1.current
S> p i2.current
Guy Decoux
ts Guest
-
Simon Strandgaard #3
Re: continuations and clone problem
On Fri, 21 Nov 2003 19:53:47 +0900, ts wrote:
Above partially solves it. However adding a position count, then it fully>
> Try this (not tested)
>
> def marshal_dump
> def marshal_load(arr)
works. Thanks.
Cloning continuations seems not to be possible ?
irb(main):001:0> x = false
=> false
irb(main):002:0> callcc{|x| }
=> nil
irb(main):003:0> p x
#<Continuation:0x81cba80>
=> nil
irb(main):004:0> y = x.clone
NoMethodError: allocator undefined for Continuation
from (irb):4:in `clone'
from (irb):4
Therefore when doing cloning, I must iterate until @position are reached.
Any idea if this skip-until-position code can be reduced?
--
Simon Strandgaard
server> ruby a.rb
"l"
"o"
server> expand -t2 a.rb
class Object
def deep_clone
Marshal::load(Marshal.dump(self))
end
end
class IteratorContinuation
def initialize(instance, symbol, position=nil)
@instance = instance
@symbol = symbol
@position = position || 0
first
@position.times { self.next } # TODO: can this be avoided ?
end
def first
@value = nil
@resume_where = false
@return_where = Proc.new{}
@instance.method(@symbol).call {|i|
@value = i
callcc{|@resume_where|
@return_where.call
return
}
}
@resume_where = false
@return_where.call
end
def next
@position += 1
callcc{|@return_where| @resume_where.call }
end
def is_done?
@resume_where == false
end
def current
@value
end
def clone
self.class.new(@instance, @symbol, @position)
end
def marshal_dump
[@instance, @symbol, @position]
end
def marshal_load(arr)
initialize(*arr)
end
end
i1 = IteratorContinuation.new("hello world", :each_byte)
i1.next
i1.next
i1.next
i2 = i1.clone
#i2 = i1.deep_clone
i2.next
p i1.current.chr #=> "l"
p i2.current.chr #=> "o"
server>
Simon Strandgaard Guest



Reply With Quote

