This post originated from an RSS feed registered with Ruby Buzz
by Red Handed.
Original Post: Arity Makes Good Curry
Feed Title: RedHanded
Feed URL: http://redhanded.hobix.com/index.xml
Feed Description: sneaking Ruby through the system
kig just dropped this snip in the comments of the pipes discussion, which had morphed into a discussion about functional programming.
class Fun < Proc
def call(*args)
if args.size < arity.abs and arity != -1
Fun.new{|*a| call(*(args+a)) }
else
super
end
end
alias_method :[], :call
end
def fun &block
Fun.new &block
end
f = fun{|a, b, c| a * b / c }
f[10, 20, 30] == f[10][20][30]
#=> true
You can sort of curry methods with this, like so:
class Turtle
def draw *args
fun { |x, y| ... }.call(*args)
end
end
But you will need to use the bracket syntax on the function returned by the method.