From: Ross Bamford Date: 2006-02-22T02:41:12+09:00 Subject: Re: Ruby Murray - Sub::Curry on Ruby Acid On Wed, 2006-02-22 at 02:13 +0900, henon wrote: > cool naming, nice functionality, easy using. > AFAIK this is a instantiation of the Design Pattern called "Command" by > the Gang of Four. > i can not imagine a problem where i needed such flexible argument list. > can anyone provide a motivation example in ruby? > i'd suggest to add a small sample of usage to the docs. > -- henon Oh, I never said it was _useful_ :) Actually, I don't think there's anything in Ruby that can't be done (better) some other way, but currying is one of those higher-order things that every (decent) language should have ;). Most of the examples I could contrive are in the docs - not sure if it's linked prominently enough but did you see http://rubymurray.rubyforge.org/files/doc/currybook_rdoc.html ? James Edward Gray II also came up with a good example in the quiz summary, based on his LazySpice spice (included in this release): # Lazy Evaluation meets Currying... class LazySpice < Curry::SpiceArg def initialize( &promise ) super("LAZYSPICE") @promise = promise end def spice_arg( args ) # called to provide the missing argument [@promise.call] end end logger = lambda do |time, message| puts "[#{time.strftime('%I:%M:%S %p %m/%d/%y')}] #{message}" end log_now = logger.curry(LazySpice.new { Time.now }) log_now["First Message."] # => [12:47:53 PM 02/01/06] First Message. sleep 3 log_now["Second Message."] # => [12:47:56 PM 02/01/06] Second Message. Again, not something that's difficult to do by other means (default argument values for example) but, well, there you go. -- Ross Bamford - rosco@roscopeco.REMOVE.co.uk