Operators
- Operator Precedence
- Mathematical Operators
- Equality & Comparison Operators
- Logical Operators
- The Conditional Operator
- The Null-coalescing Operator
- The Error-coalescing Operator
Operator Precedence
Operator precedence in the table below goes from high at the top to low at the bottom. Operators at the same level have the same precedence.
Level | Operators | Associativity |
---|---|---|
Call |
() . : ::
|
Left |
Power |
**
|
Right |
Unary |
! + - ~ try
|
Right |
Bitwise |
& | ^ >> <<
|
Left |
Multiplication |
* / // %
|
Left |
Addition |
+ -
|
Left |
Comparison |
> >= < <=
|
Left |
Equality |
== !=
|
Left |
Logical |
&& || ?? !!
|
Left |
Conditional |
? :|
|
None |
Assignment |
= += -=
|
Right |
Note that conditional expressions using the ternary operator ? :|
can't be nested. (Checkmate, Satan.)
Mathematical Operators
+ | Addition (binary) or a no op (unary). Addition returns an integer if both operands are integers or a float if either or both are floats. |
- | Subtraction (binary) or negation (unary). Subtraction returns an integer if both operands are integers or a float if either or both are floats. |
* | Multiplication. Returns an integer if both operands are integers or a float if either or both are floats. |
/ | Floating-point division. Both operands will be converted to floats and the result will be a float. |
// | Truncating division. Returns an integer if both operands are integers or a float if either or both are floats. |
% | Modulo/remainder operator. Returns an integer if both operands are integers or a float if either or both are floats. |
** | Power operator. Both operands are converted to floats and the result is a float. |
You can overload the mathematical operators to customize their behaviour for your own types.
Equality & Comparison Operators
The equality (==
, !=
) and comparison (>
, >=
, <
, <=
) operators each take two operands and evaluate to a boolean.
- Numbers are equal if their values are numerically equal.
- Strings are equal if they have the same content.
- Tuples are equal if they have the same length and their elements are equal.
- By default, other objects are equal only if they are the same object.
Logical Operators
The logical operators are ||
(OR), &&
(AND), and !
(NOT). They evaluate the truthiness of their operands.
The logical operators ||
and &&
are short-circuiting.
The value of the logical-OR expression a || b
is the value of the first operand if that operand is truthy, otherwise the value of the second operand.
This means you can use the ||
operator to swap in a default value in place of a falsey expression:
var foo = maybe_falsey() || "default";
The value of the logical-AND expression a && b
is the value of the first operand if that operand is falsey, otherwise the value of the second operand.
This means you can use the &&
operator to conditionally chain a sequence of expressions:
func1() && func2() && func3();
func2()
will only be called if func1()
returns a truthy value; func3()
will only be called if func2()
returns a truthy value.
The Conditional Operator
The conditional or ternary operator takes three operands. It looks like this:
var foo = condition ? expr1 :| expr2;
The value of the expression is expr1
if condition
evaluates as truthy, otherwise expr2
.
The Null-coalescing Operator
The null-coalescing operator ??
lets you swap in a default value in place of a null
:
var foo = maybe_null() ?? "default";
The value of the expression a ?? b
is the value of the first operand if that operand is not null
, otherwise the value of the second operand.
The Error-coalescing Operator
The error-coalescing operator !!
lets you swap in a default value in place of an error:
var foo = maybe_error() !! "default";
The value of the expression a !! b
is the value of the first operand if that operand is not an $err
, otherwise the value of the second operand.