On Sat, Mar 26, 2005 at 03:13:07AM -0700, Luke Palmer wrote:
: Chip Salzenberg writes:
: > I'm working on enhancing Perl6::Subs[*] to support more parameter
: > traits than just C<is required>.  I have some questions about
: > parameters and traits.  (These questions all apply to pure Perl 6,
: > which I know I won't be able to translate completely, but I want to
: > know which target I'm missing.)
: > 
: >  * Given a parameter C<Array @a>, it's obvious I'm not allowed to
: >    C<push @a,1>, because I didn't say C<is rw>.  But am I allowed to
: >    C<@a[0]++>?  How about C<@a[0][0]++>?  How deep is read-only-ness?
: 
: I believe that the default constant parameters is so we don't have to
: construct lvalues out of our arguments when we call.  So that probably
: means that it's very shallow.
: 
: On the language level, I've been thinking that it would be good to go
: C's way and not allow any parameter modification whatsoever.  The
: problem is that in the presence of methods, we can't tell whether we
: have to lvaluize anymore, so we're back to the Perl 5 trap of lvaluizing
: everything.  

I think only predeclared simple subs are allowed to have "rw" parameters.
Methods can have "is ref" parameters, but those don't require enforced
lvaluehood on the caller end like rw does.

: So if you want things modified, you'd have to pass in a reference.
: Arrays and hashes would not generally have this restriction, since we
: pass references of those guys anyway.

Yes.

: >  * Similarly, how deep is the copy implied by C<is copy>?
: 
: I think it's exactly as deep as read-only-ness.

And both may be exactly as deep as COW.

: >  * Do traits attach syntactically to the variable name, or to the
: >    declaration as a whole?
: > 
: >      variable:     @a is rw of Array
: >                    Array @a is rw
: > 
: >      declaration:  @a of Array is rw
: >                    Array @a is rw
: 
: Well, from this example it seems like `of` should be tighter than `is`.

Traits are not allowed on ordinary rvalues, only on declarations.  "is"
traits always attach to the main declaration.  "of" types always attach
to the container on their immediate left.

: >  * As far as I can tell, the choice of spelling an array parameter
: >    C<Array @a> or C<Array $a> is entirely cosmetic: both @a and
: >    $a are capable of holding an Array reference.  Is there actually
: >    a difference, e.g. in how they handle an undefined value?
: 
: Hmmm... well I think all scalars are allowed to be undef.  Arrays
: aren't.  So yeah, if you give @a undef, it probably gives you [] (or
: croaks, but I don't think that's a good idea).  If you give $a undef, it
: gives you undef.

As I mentioned in my other message, I think we should not assume that
Perl 6 works the same in this regard as Perl 5 does.  There needs to be
something we can return that not only means (), but means also means
"You're hosed! (And here's why.)"  And I think we can make undef mean
that if we make it lazily sensitive to scalar/list context (much like @a
itself can be lazily sensitive to context).

Hmm, maybe it would simpler to just tell everyone undef is a special empty
lazy array that refuses to produce a value no matter how you ask.

Larry

Reply via email to