Hi,

(sorry for the long delay.)

Juerd <juerd <at> convolution.nl> writes:
> Ingo Blechschmidt skribis 2005-09-19 14:21 (+0000):
> >     \(1,2,3);        # Reference to a list promoted to an array (!)
> >     \(((1,2,3)));    # same
> 
> Except that it has to be a reference to a reference, because (1,2)
> (in scalar context) already evaluates to a reference, because it can't
> be a pure array.

See my definition of &prefix:<\> below. Parentheses used for grouping
do not change the context.

> Could you think of a formal specification of \ the way you want it,
> that doesn't exist of only examples? What context does it give its
> RHS?

    multi prefix:<\> (Item $item) {...}
    multi prefix:<\> (@array)     {...}
    multi prefix:<\> (%hash)      {...}
    # (The necessary magic needed for dealing with the proposed
    # [EMAIL PROTECTED], which would be equivalent to map { \$_ } @array,
    # is not included here.)

So:

    \$obj;    # $obj in item context
    [EMAIL PROTECTED];  # @array in Array context (so @array doesn't auto-ref
              # to a reference to itself, which would cause the problem
              # you mentioned (that [EMAIL PROTECTED] would evaluate to a ref
              # pointing to a ref))
    \%hash;   # analogous

> What do you want , in that comma to do?

    sub infix:<,> ([EMAIL PROTECTED] is rw) { @things }
    # The "is rw" should refer to the parameters, i.e.
    # &infix:<,> returns aliases:
    #   ($a, $b)[0] = $c;    # same as $a = $c
    #   ($a, $b)[0] =:= $a;  # true

So the comma operator supplies list context to its arguments (because
of the slurpy @things) and returns an array. It can't return a list,
because, as you've said, lists aren't real data types.

Because the comma operator supplies list context, (@a, @b) flattens
@a and @b, so it's like @a.concat(@b).

(Of course, there is still the comma operator which separates arguments.
This operator is not the &infix:<,> we talk about, e.g.:

    foo(1,2,3);      # &infix:<,> *not* called
    foo (1,2,3);     # same as
    foo( (1,2,3) );  # &infix:<,> called

(BTW, is the argument-separator comma operator accessible by a
subroutine, like most other operators are? (I think not.)))

> Are parens in any way special when used with \?

No:

    \($obj);      # same as
    \$obj;

    \((($obj)));  # same as
    \$obj;

    \($a, $b);    # same as
    do {
        my @temp = ($a, $b);
        [EMAIL PROTECTED];
    }

    \((($a, $b)));                   # is really
    prefix:<\>(((($a, $b))));        # is really
    prefix:<\>( ($a, $b) );          # is really
    # (Inner parentheses needed to prevent the comma to be treated
    # as the other comma operator which separates arguments.)
    prefix:<\>(&infix:<,>($a, $b));  # same as
    do {
        my @temp = ($a, $b);
        [EMAIL PROTECTED];
    }

> What is the precedence of \?

The comma operator should bind tighter than \:

    \$a, $b    # same as
    (\$a), $b


BTW, &list ::= &infix:<,>:

    ($a,);    # could be considered ugly
    list $a;  # same effect, but could be considered not ugly


I hope this mail makes sense :)


--Ingo

Reply via email to