Re: What about a 'series' type?



On 6/7/07, Robert Klemme <shortcutter@xxxxxxxxxxxxxx> wrote:
On 07.06.2007 16:52, Peter Marsh wrote:
>> primes = Series.new(Starting_value,Some_block_to_define_serires)
>
> Just wanted to be a bit clearer about this, the second argument is a
> block which can generate nth term in a series. This would probally take
> a while for primes, but if it were recursive then it would be easier...

IMHO for a series it would be more natural to let the block calculate
a[n+1] from a[n] wouldn't it? Of course, for Fibonacci this would only
work if you allow for multiple arguments.

Something like

#!ruby
class Serial
include Enumerable

def initialize(*init, &f)
@init = init
@f = f
end

def each(&b)
a = b.arity
current = @init
loop do
b[*current[0 ... a]]
current = Array(@f[*current])
end
self
end
end

s1 = Serial.new 0 do |x| x+1 end
s1.each {|x| p x; break if x > 10}

puts

s2 = Serial.new 0,1 do |a,b| [b,a+b] end
s2.each {|x| p x; break if x > 40}


Robert I hope you do not mind my fantasy about/over/at??? your theme.

class Serial
include Enumerable

def initialize(*init, &f)
@init = init
@f = f
@arity = f.arity
end

def get_some( some = nil, &b)
@current = @init.dup
if some && b.nil? then
(0...some).inject([]) do |acc,|
compute_next
acc << @current.first
end
else
a = b.arity
loop do
break if some && ( some -= 1 ) < 0
b[*@current.first( a )]
compute_next
end
self
end
end

private
def compute_next
@current += Array( @f[*@current] )
@current = @current.last @arity
end
end

s1 = Serial.new 0 do |x| x+1 end
s1.get_some {|x| p x; break if x > 10}
puts "-"*42
puts s1.get_some(6)

puts "-"*42
f = Serial.new 1, 1 do |x, y| x + y end
f.get_some(6){ |x,| puts x }

puts "-"*42
a = Serial.new 1, 1, 1 do |x, y, z| x + y + z end
puts a.get_some(6)

Cheers
Robert



--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

.



Relevant Pages

  • Re: What about a series type?
    ... On 6/7/07, Robert Dober wrote: ... > def initialize ... > @init = init ... puts s1.get_some ...
    (comp.lang.ruby)
  • Re: New user - correct way to think and write code
    ... def print_from_to ... the loop because that is much cleaner. ... start.upto{|number| puts number} ...
    (comp.lang.ruby)
  • Re: No speedup...!
    ... Oliver Bandel wrote: ... puts line ... it has another loop that runs until there are no more ... def look_for_begin ...
    (comp.lang.ruby)
  • Re: Error in While Loop
    ... I am afraid why my loop is not getting incremented for value of i. ... Attached is the XML file for your referance. ... def loop_1 ... puts "AT LOOP 1" ...
    (comp.lang.ruby)
  • Error in While Loop
    ... Following is my Ruby Code Wherein I am reading an XML file. ... I am afraid why my loop is not getting incremented for value of i. ... def loop_1 ... puts "AT LOOP 1" ...
    (comp.lang.ruby)