Cool... I think this works :-)


#does not work when trying to send an entire mathematical expresion as
a param
def sigma(floor, to_do, cap)
	x = 0
	floor.upto(cap) {|i|
		#x += i.send(to_do)
		x += to_do[i]
	}
	return x
end
puts sigma(4, lambda{|x| x ** 2}, 20)

Thanks a million!


Neutek wrote:
> Robert Klemme wrote:
> > ** SPOILER **
> >
> > Don't read on if you first want to experiment yourself.
> >
> >
> > On 17.01.2007 17:48, Neutek wrote:
> > > Robert, I was actually reading the summation wiki and they had a few
> > > code examples in C++/Java.. I thought I'd goof a bit and write
> > > something out in ruby. Of course, I hit the roadblock when trying to
> > > pass math operators(or methods rather) to a method...
> >
> > What is the "summation wiki"?  Are you referring to this page?
> > http://en.wikipedia.org/wiki/Sum
> >
> > If yes, here are some more ways:
> >
> > # plain values
> > sum = (m..n).inject(0){|s,x| s + x}
> >
> > # with a function
> > f = lambda {|i| i * 2}
> > sum = (m..n).inject(0){|s,x| s + f[x]}
> >
> > # in a method
> > def sum(m, n, f)
> >    (m..n).inject(0){|s,x| s + f[x]}
> > end
> >
> > s = sum( 1, 2, lambda {|x| x * 2} )
> >
> > etc.
> >
> > Advantage of using lambdas is that they are more flexible than method
> > names and can contain arbitrary calculations.
> >
> > Kind regards
> >
> > 	robert
> >
> >
> > PS: Please don't top post.
>
> What's top post? (sorry, I'm new to google groups --I put my reply at
> the bottom if this is what you meant )
>
> I'll read through your example now but figured what I worked on in the
> interim was worth posting..
>
>
> #works
> def test(a, to_do, b)
> 	return a.send(to_do, b)
> end
> puts test(2, :**, 3)
>
> #does not work when trying to send an entire mathematical expresion as
> a param
> def sigma(floor, to_do, cap)
> 	x = 0
> 	floor.upto(cap) {|i|
> 		x += i.send(to_do)
> 	}
> 	return x
> end
> puts sigma(4, :**2, 20)
>
>
> #does not work.. but another example of what I would expect :(
>
> def do_it(n, to_do)
> 	return n.send(to_do)
> end
> puts sigma(3, :+4/2) #should yield 5
> 
> 
> (Thank you)?