From: Yusuke Endoh Date: 2011-04-26T02:28:19+09:00 Subject: [ruby-core:35885] [Ruby 1.9 - Bug #4610] Proc#curry behavior is inconsistent with lambdas containing default argument values Issue #4610 has been updated by Yusuke Endoh. Target version set to 2.0 Hello, 2011/4/25 Joshua Ballanco : > This behavior seem very inconsistent. Indeed, it is arguable how Proc#curry should handle optional parameters, but I don't think it is inconsistent. In either case, a curried Proc fires its execution as soon as required arguments are given. At least, this is intended, not a bug. So I'm moving this ticket to 2.0 feature request tracker. > Ideally, if I wanted to use the default argument at a certain position in a currie proc, I would just #call with no arguments, like so: > > ruby-1.9.2-p180 :007 > c.('one').().('three') > #=> Propose that this result in: "one, ni, three" It is interesting, but incompatible with the current behavior. And I can think that it will be even inconsistent: c.('one', 'two').( 'three') #=> one, two, three c.('one') .( 'two', 'three') #=> one, two, three c.() .('one', 'two', 'three') #=> wrong number of arguments -- Yusuke Endoh ---------------------------------------- Bug #4610: Proc#curry behavior is inconsistent with lambdas containing default argument values http://redmine.ruby-lang.org/issues/4610 Author: Joshua Ballanco Status: Open Priority: Normal Assignee: Category: Target version: 2.0 ruby -v: 1.9.2p180 If I curry a lambda with 3 arguments, then I can call three times with one argument each time to get the desired results: ruby-1.9.2-p180 :001 > l = ->(a, b, c) { puts "#{a}, #{b}, #{c}" } # ruby-1.9.2-p180 :002 > c = l.curry # ruby-1.9.2-p180 :003 > c.('one').('two').('three') one, two, three nil However, if the lambda has default values and I curry it, the entire lambda is evaluated after the first #call: ruby-1.9.2-p180 :004 > l = ->(a = 'ichi', b = 'ni', c = 'san') { puts "#{a}, #{b}, #{c}" } # ruby-1.9.2-p180 :005 > c = l.curry # ruby-1.9.2-p180 :006 > c.('one').('two').('three') one, ni, san NoMethodError: undefined method `call' for nil:NilClass This behavior seem very inconsistent. Ideally, if I wanted to use the default argument at a certain position in a currie proc, I would just #call with no arguments, like so: ruby-1.9.2-p180 :007 > c.('one').().('three') #=> Propose that this result in: "one, ni, three" -- http://redmine.ruby-lang.org