Foreword
This lists all ooc operators, from highest precendence to lowest precedence
Access
Array access
The array-index operator is []
, the array-modify operator’s short form is []=
Examples:
arr[0] = '\n'
return arr[0]
Pointers
The address-of operator is a post-fix &
, the dereference operator is a post-fix
@
:
a := 42
aPtr := a&
aToo := aPtr@
Call
Technically not an operator, but call is in that priority level:
a := func -> Int { 42 }
a()
Member access
Also technically not an operator. Simply two identifiers side by side, not using dot, unlike some other programming languages:
dog name
dog race
Casting
The as
operator is used to cast from one type to the other:
pi := 3.14
roughlyPi := pi as Int
Product
Binary operators
The exponent operator is **
, the multiplication operator is *
,
and the division operator is /
.
Unary operators
Logical not is a prefixed !
, binary not is a prefixed ~
.
Sum
The addition operator is +
, subtraction is -
,
modulo is %
Shift
Right shift is >>
, left shift is <<
Inequality
You have your regular less than <
, greater than >
,
less than or equal <=
, more than or equal >=
,
but also the comparison operator <=>
(evaluates to -1
if less than, 0 if equal, 1 if greater than).
Equality
Equality operator is ==
, inequality operator is !=
Binary and boolean operations
Binary and is &
, xor is ^
, or is |
.
Logical and is &&
, logical or is ||
.
Ternary
The ternary operator is ?:
as in condition ? ifTrue : ifFalse
.
Assignment
The assignment operator is =
, the following variants exist:
+=
, -=
, *=
, **=
, /=
, >>=
, <<=
, ^=
, |=
, &=
.
The declare-assignment operator is :=
. And the declare-property-assignment
operator is ::=
. For more details on these, see the Variables and
Properties pages.
Double arrow
The double arrow operator =>
- it must be overloaded.
Operator overloading
Overloading an operator can be done as a function-like, using the
operator
keyword:
operator + (v1, v2: Vec2) -> Vec2 { v1 add(v2) }
However, if the operator is linked to a type, it’s better to declare it in the type itself, so that it’ll be usable even if the module containing the type declaration isn’t explicitly imported:
Vec2: class {
// other stuff
operator + (v: This) -> This { add(v) }
}