On Fri, 25 Oct 2002, Michael Lazzaro wrote:
: Since it's been a full month since the start of the monster "operator 
: precedence" thread, here's what I've been able to gather as the 
: revised, new-and-improved list of Perl6 operators, IF we did all the 
: xor/cat/regex-related changes as discussed as of this moment.  ;-)  I 
: think this list is accurate and complete so far, LMK?

Getting there.

:      $   - dereference scalarref
:      @   - dereference arrayref
:      %   - dereference hashref
:      &   - dereference coderef

These are not currently operators, just as they aren't really operators
in Perl 5.  If you say

    $( foo() )
    @( bar() )

you don't get a dereference as it currently stands.  You'd have to use

    ${ foo() }
    @{ bar() }

But maybe that's something we should talk about.

:      *   - list flattening
:      ?   - force to bool context
:      !   - force to bool context, negate
:      +   - force to numeric context
:      -   - force to numeric context, negate
:      ~   - force to string context

We're obviously missing the "force to string context, negate" operator.  :-)

:      -X  - filetest operators

Which are actually considered a variant of named unaries, if I recall...

: other postfix operators:
: 
:      []  - array access
:      {}  - hash access

And () when an operator is expected rather than a term.

: hyperoperators:
: 
:      ^   - as prefix to any unary/binary operator, "vectorizes" the 
: operator

One is tempted to make it "v" instead of "^", but then we couldn't have
any actual operators starting with "v".

: binary operators:
:      +   -    *    /    %    **   x    ~    <<   >>
:      +=  -=   *=   /=   %=   **=  x=   ~=   <<=  >>=

We could distinguish an xx operator (along with xx=) that does list
replication, rather than requiring parens around the left argument.

:      <    >    <=   =>   ==   !=   <=>
:      lt   gt   le   ge   eq   ne   cmp

Er, that would be >=, not =>.

:      &&    ||    !!    //        - boolean operations
:      &&=   ||=   !!=   //=
:      and   or    xor
: 
:      .&    .|    .!              - bitwise operations
:      .&=   .|=   .!=

Now I'm wondering whether these should be split into:

     +&    +|    +!              - bitwise operations on int
     +&=   +|=   +!=

     ~&    ~|    ~!              - bitwise operations on str
     ~&=   ~|=   ~!=

Except the . looks more like a bit.  And the current str/int rules don't
cause that much problem.  One could perhaps force it this way:

    +$x .| +$y
    ~$x .| ~$y

And it's more like the semantics people are used to, for some
definition of "people", and some definition of "used to".  I dunno...

Maybe it's really

     .&    .|    .!              - bitwise operations on int
     .&=   .|=   .!=

     .and    .or    .xor         - bitwise operations on str
     .and=   .or=   .xor=

except that "and", "or" and "xor" aren't string ops in real life...

Could go with

     .a    .o    .x         - bitwise operations on str
     .a=   .o=   .x=

Or we could leave .& et al. as the unmarked form, and just mark the
string-wise version, thus falling further into the Icon trap:

     .~&    .~|    .~!              - bitwise operations on str
     .~&=   .~|=   .~!=

Then we could allow

    @a ^.~|= @b;        # hyper bitwise string or-equals

but only with a special rule in the grammar that makes the comment
mandatory.  :-)

:       &     |     !              - superpositional
:      all   any   one  (none?)

I think a good case can be made for *not* defining the corresponding
super assignment operators: &=, |=, and umm...I guess it would have
to be !=, er...

:       ~~     !~                  - smartmatch and/or perl5 '=~' (?)
:      like  unlike

Or something like/unlike that...

:      .=      -  (?)

Not sure I believe in this one as method call because it confuses the
variable with the value.  Besides, somebody's gonna expect it to mean
the same as .!($a .! $b), though that would be .== in fact, I suppose.

:      ->      - like 'sub'

Not really an operator.  But if you count this you also have to count
the optional "hash" on the front of "hash { foo() }", where it's not
clear whether the {} is a hash or a sub.

:      ..      - range
:      ...     - yada**3

Mmm, not really.  yada xx 3  is a term, not an operator.  As an
operator, ...  is likely to have the Ruby interpretation of omitting
the endpoint (unless we make it mean ..Inf or some such).

:      is

Not really a general operator.  Basically only availabe on declarators.

: parens, misc, and quotelike operators:
: 
:      ()

Plus [] and {} when a term is expected!

:      m//
:      s///     - still around, but maybe shorthand for something else
:      tr///

Most special quote forms are likely to be shorthand for something else...

:      '...'   "..."   `...`   /.../
:        q      qq      qx      qr      qw

I'd still love to the double angles for a qw synonym.

:      (heredocs)     - (exact format unknown)
: 
: 
: named unary (prefix) operators:
: 
:      my      our      temp

"my" and "our" aren't really operators.  On the other hand, "temp"
is, and so is "let", which seems to be missing from your list.

:      not     ref      defined    undef
:      length  exists   delete

"not" is not the same precedences as "named unary" operators.  "length"
is probably just a method of str, Array, etc.

:      sqrt    log        sin     cos       tan
:      lc      lcfirst    uc      ucfirst
:      int     ord        oct     hex      (bin?)

: 
:      (...etc...)

Not clear how many of these are just universal or near-universal methods.
Which would make some of them list-op variants, if we follow Perl 5 rules...

Larry

Reply via email to