On Sun, Sep 21, 2008 at 07:02:37PM -0700, Michael G Schwern wrote: > I'm pondering what the proper syntax is for a subroutine parameter with both a > trait and a default. That is... > sub foo ($arg = 42) > and > sub foo ($arg is readonly) > together in one parameter. Would that be > sub foo ($arg = 42 is readonly) > or > sub foo ($arg is readonly = 42) > > The first looks ambiguous, what if the trait is meant to apply to the default? > The second looks downright wrong.
The STD.pm grammar [1] shows that the second is the correct form -- i.e., default values occur after traits. (See "token parameter" on or about line 2630.) I think part of the reason for this is that traits appearing after the default value would be applied to the default value instead of the parameter. A few other examples from the synopses seem to confirm this pattern: S03:2289: my Dog $fido is trained is vicious = 1 S03:3828: constant Dog $foo is woof = 123; S06:1558: constant $pi is approximated = 3; S12:1393: has SomeType $.prop is rw = 1; 1. http://svn.pugscode.org/pugs/src/perl6/STD.pm > PS Incidentally, it seems silly to have "is rw" but not "is ro". I keep > writing "is ro". Yes, we've also run into this problem a few times while working on Rakudo. Pm