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