Expressions

Everything in Farango has a value – there are no statements, only expressions.

Binary Operators

Binary operators are operators taking two parameters. Invoking an operator can be done with two possible syntaxes:

  • Operator-like: <expr> <op> <expr>
  • Function-like: (<op>)(<expr>, <expr>)

The language shall natively provide the following operators:

Operator Description
* Multiplication
/ Division
% Modulo
+ Addition / Union
- Subtraction
== Equal
!= Not equal
> Greater than
< Less than
>= Equal or greater than
<= Equal or less than
<=> Compare
&& Logical AND
|| Logical OR
>> Bitwise right shift
<< Bitwise left shift
^ Bitwise XOR
| Bitwise OR
& Bitwise AND

Unary operators

Unary operators, unlike binary operators, only take one parameter.

The language shall natively provide the following operators:

Operator Description
! Logical not
~ Bitwise not
- Minus
+ Plus
++expr Pre-increment
--expr Pre-decrement
expr++ Post-increment
expr-- Post-decrement

Operator precedence

Operators in an expression have evaluation priority: this is called precedence. An operator takes precedence over an other operator if it is evaluated before the other. As an example, * takes precedence over +, because a + b * c can be expanded to a + (b * c), and not (a + b) * c.

Below is a table of operators sorted from high precedence (top) to low precedence (bottom):

Operator Precedence
Postfix expr++ expr--
Unary ++expr --expr +expr -expr ~ !
User-defined  
Multiplicative * / %
Additive + -
Shift << >>
Relational < > <= >= <=>
Equality == !=
Bitwise AND &
Bitwise XOR ^
Bitwise OR |
Logical AND &&
Logical OR ||
Assignment = += -= *= /= %= &= ^= |= <<= >>=

User defined operators

User may define or overload operators by declaring a function with the operator symbol enclosed in parenthesis as identifier:

fun (<>)(lhs, rhs) = {
    lhs != rhs
}

Here we declare the binary operator <> as an alias of !=. Alternatively, one could implement the operator as:

(<>) = (!=)

There are no requirements on the purity of user-defined operators, but programmers should aspire to make their operators pure.

There are also no requirements on operators laws, with some exceptions on default operator overloads:

  • +, *, ^, |, &, == and != shall be associative and commutative.
  • All comparison operators shall be transitive.