On Sat, May 24, 2008 at 4:06 PM, Eric Mahurin < eric.mahurin gmail.com">eric.mahurin gmail.com> wrote:
On Fri, May 23, 2008 at 7:18 AM, ts < decoux  moulon.inr a.fr" target="_blank">decoux moulon.inra.fr> wrote:
Eric Mahurin wrote:
> Is there any reason this idea couldn';t be applied to head?
Try it on your personal version.
Guy Decoux Here is a patch for handling optional args for blocks using this simple idea - use a "primary_value" instead of "arg_value" for the default values. I simply did some cutting and pasting for the argument definitions for "def" and changed "arg_value" to "primary_value". It worked on the first try! Spent more time writing tests (included) than adding the new functionality.
Matz, any chance this could be integrated for a trial period at least? It shouldn9;t cause any compatibility issues.
For some reason, gmail attached my patch with base64 encoding.& nbsp; A simple cut-n-paste of the patch is below. Also here would be a reasonable ChangeLog entry:
* parse.y (block_param) : added alternatives for allowing arguments with defaults. These are identical to what is in f_args except f_block_optarg is used instead of f_optarg. f_block_optarg is the same as f_optarg except primary_value is used instead of arg_value.
* sample/test.rb (assignment) : tested these new alternatives with defaults for arguments.
Index: sample/test.rb =================================================================== --- sample/test.rb (revision 16568)
+++ sample/test.rb (working copy)
 -296,6 +296,64   test_ok(f.call([42,55]) == [[42,55]]) test_ok(f.call(42,55) == [42,55]) +f = lambda { |a, b=42, *c| [a,b,c] } +test_ok(f.call(1 ) == [1,42,[ ]] )
+test_ok(f.call(1,43 ) == [1,43,[ ]] ) +test_ok(f.call(1,43,44) == [1,43,[44]] ) + +f = lambda { |a, b=(a|16), *c, &block| [a,b,c,block&&block[]] } +test_ok(f.call(8 ) == [8,24,[ ],nil] )
+test_ok(f.call(8,43 ) == [8,43,[ ],nil] ) +test_ok(f.call(8,43,44) == [8,43,[44],nil] ) +test_ok(f.call(8 ) == [8,24,[ ],45 ] ) +test_ok(f.call(8,43 ) == [8,43,[ ],45 ] ) +test_ok(f.call(8,43,44) == [8,43,[44],45 ] )
+ +f = lambda { |a, b=42, *c, d| [a,b,c,d] } +test_ok(f.call(1 ,99) == [1,42,[ ],99] ) +test_ok(f.call(1,43 ,99) == [1,43,[ ],99] ) +test_ok(f.call(1,43,44,99) == [1,43,[44],99] ) + +f = lambda { |a, b=(a|16), &block| [a,b,block&&block[]] }
+test_ok(f.call(8 ) == [8,24,nil] ) +test_ok(f.call(8,43) == [8,43,nil] ) +test_ok(f.call(8,43) == [8,43,nil] ) +test_ok(f.call(8 ) == [8,24,45 ] ) +test_ok(f.call(8,43) == [8,43,45 ] )
+test_ok(f.call(8,43) == [8,43,45 ] ) + +f = lambda { |a, b=42, d| [a,b,d] } +test_ok(f.call(1 ,99) == [1,42,99] ) +test_ok(f.call(1,43,99) == [1,43,99] ) +test_ok(f.call(1,43,99) == [1,43,99] ) +
+f = lambda { |b=42, *c, &block| [b,c,block&&block[]] } +test_ok(f.call( ) == [42,[ ],nil] ) +test_ok(f.call(43 ) == [43,[ ],nil] ) +test_ok(f.call(43,44) == [43,[44],nil] ) +test_ok(f.call( ) == [42,[ ],45 ] )
+test_ok(f.call(43 ) == [43,[ ],45 ] ) +test_ok(f.call(43,44) == [43,[44],45 ] ) + +f = lambda { |b=42, *c, d| [b,c,d] } +test_ok(f.call( 99) == [42,[ ],99] ) +test_ok(f.call(43 ,99) == [43,[ ],99] )
+test_ok(f.call(43,44,99) == [43,[44],99] ) + +f = lambda { |b=42, &block| [b,block&&block[]] } +test_ok(f.call( ) == [42,nil] ) +test_ok(f.call(43) == [43,nil] ) +test_ok(f.call(43) == [43,nil] )
+test_ok(f.call( ) == [42,45 ] ) +test_ok(f.call(43) == [43,45 ] ) +test_ok(f.call(43) == [43,45 ] ) + +f = lambda { |b=42, d| [b,d] } +test_ok(f.call( 99) == [42,99] ) +test_ok(f.call(43,99) == [43,99] )
+test_ok(f.call(43,99) == [43,99] ) + + a,=*[1] test_ok(a == 1) a,=*[[1]] Index: parse.y =================================================================== --- parse.y (revision 16568) +++ parse.y (working copy)
 -666,6 +666,7   %type <node> open_args paren_args opt_paren_args %type <node> command_args aref_args opt_block_arg block_arg var_ref var_lhs %type <node> mrhs superclass block_call block_command
+%type <node> f_block_optarg f_block_opt %type <node> f_arglist f_args f_arg f_arg_item f_optarg f_marg f_marg_list f_margs %type <node> assoc_list assocs assoc undef_list backref string_dvar for_var
%type <node> block_para |