Author: autrijus
Date: Sat Apr  1 21:18:08 2006
New Revision: 8535

Modified:
   doc/trunk/design/syn/S06.pod

Log:
* S06: Rationalize the free mix of named and positional args.

       Positional pair arguments must _always_ be put in parentheses.

       Multiple named arguments with the same name can be concatenated
       into a @param now.  $param gets the _last_ named argument,
       similar to how hash constructor and rule bindings work.

Modified: doc/trunk/design/syn/S06.pod
==============================================================================
--- doc/trunk/design/syn/S06.pod        (original)
+++ doc/trunk/design/syn/S06.pod        Sat Apr  1 21:18:08 2006
@@ -338,6 +338,8 @@
 possible on those arguments that are bound to a final slurpy or
 arglist variable.)
 
+=head2 Named arguments
+
 Named arguments are recognized syntactically at the
 "comma" level.  Pairs intended as positional arguments rather than
 named arguments must be isolated by extra parens:
@@ -405,36 +407,34 @@
 bound to positionals only by name, not as ordinary positional C<Pair>
 objects.  Leftover named arguments can be slurped into a slurpy hash.
 
-After the positional and named arguments, all the rest of the arguments
-are taken to be list arguments.  Any pairs within the list are taken
-to be list elements rather than named arguments, and show up as C<Pair>
-arguments even if the compiler marked them as named.
-
-It is possible that named pairs are not really a separate type; it
-would be sufficient to have a bit somewhere in the Pair that can be
-interrogated under the C<.named> property.  The compiler is allowed to
-stop marking "named" pairs at the first C<< <== >>, but the code that
-converts unused positional arguments to implicit slurpy list needs to
-be careful to clear the C<.named> property on arguments so converted.
-For instance, if you say
+Because named and positional arguments can be freely mixed, the
+programmer always needs to disambiguate pairs literals from named
+arguments with parenthesis:
 
+    # Named argument "a"
     push @array, 1, 2, :a<b>;
 
-the compiler cannot know that the slurpy list starts at 1, so it markes
-:a<b> as a named pair.  But that mark needs to be cleared, or
+    # Pair object (a=>'b')
+    push @array, 1, 2, (:a<b>);
+
+Perl 6 allows multiple same-named arguments, and records the relative
+order of arguments with the same name.  When there are more than one
+argument, the C<@> sigil in the parameter list causes the arguments
+to be concatenated:
 
-    say pop(@array);
+    sub fun (Int @x) { ... }
+    fun( x => 1, x => 2 );  # @x := (1, 2)
 
-will then think you said:
+Other sigils binds only to the I<last> argument with that name:
 
-    say *pop(@array);
+    sub fun (Int $x) { ... }
+    f( x => 1, x => 2 );    # $x := 2
 
-and treat :a<b> as a named argument to print, which is not what you want.
+This means a defaults must come I<before> known named parameters,
+similar to how hash constructors work:
 
-In any event, the named parameters need to be kept in the list until
-bound.  An implementation that pulls named parameters out of the list
-into a hash prematurely will lose the ordering of the push above,
-for instance.
+    # Allow "x" and "y" in %defaults be overrided
+    f( *%defaults, x => 1, y => 2 );
 
 =head2 Invocant parameters
 

Reply via email to