Langur uses the following, in order of descending precedence.
See the numbers page for math operator descriptions.
category | operators | associativityL/R |
---|---|---|
after (function calls and indexing) | () [] |
leftL |
exponent | ^ ^/ | rightR |
prefix | - | |
product | * / \ // rem mod |
leftL |
sum | + - | leftL |
range | .. | leftL |
append | ~ (tilde) | leftL |
forward | -> | leftL |
boolean | < <= > >= <? <=? >? >=? div ndiv div? ndiv? is is not in not in of not of |
leftL |
logical negation | not not? | |
equality | == != ==? !=? |
leftL |
logical and | and nand and? nand? |
leftL |
logical equivalence | xor nxor xor? nxor? |
leftL |
logical or | or nor or? nor? |
leftL |
assignment | = | rightR |
The -> operator (forward operator) forwards a value to a function or a regex. This may be used within a switch to match a value against a regex.
The is and is not operators are used with a type as the right operand, such as string or list, or in some special cases, a specific string. See the type page for details.
The in operator tests whether a value exists within a composed value. The of operator tests whether a hypothetical index value is valid for a composed value.
These should not be confused with for in/for of loops, which are automated loops.
The append operator works between 2 strings, 2 lists, or 2 hashes.
It can also be used between a string and integer or between 2 integers (code points), generating a string.
Using append between hashes will silently overwrite if keys in the right hash match keys in the left hash. If you use the more() function instead to add to a hash, it will not overwrite, but throw an exception for matching keys.
Appending null to anything acts as a no-op (evaluates to left operand) instead of throwing an exception. Note that this is not how the more() function treats null.
Values of types which have a zero value (number, string, list, hash, and duration) may be multiplied with a Boolean to receive the original value (if true) or the zero value (if false).
"string" * (value > 10) # yields "string" if expression true and zero-length string if false
Infix logical and mathematical operators, and the append operator, can be used as combination operators with assignment. For example, writing x += 1 is the same as writing x = x + 1.
It is as though the right-hand is wrapped in parentheses, so that x *= a + b is the equivalent of x = x * (a + b), not x = x * a + b (which would be the same as x = (x * a) + b because of operator precedence).
Normal operators treat null as an ordinary value (don't favor propagating null). Testing null == null returns true and null == false returns false.
Operators ending with ? are null-propagating (or "database") operators. For these, if either side is null, the result is null. Testing null ==? anything returns null.
The and, or, nand and nor operators are short-circuiting.
Null-propagating operators are short-circuiting in a different manner (only if the left value is null). This includes all infix operators that end with ?, such as and?, nor?, ==?, xor?, etc.
Items of the same type (lists, hashes, or ranges) may be directly compared for equality or inequality.