# List of operators

The operators are algebraic primitives powering Envision. Below, we list the operators supported by Envision.

Generic operators

Numeric operators

Logical operators

Distribution operators

Random variable operators

Operator precedence

## Generic operators

The following operators are supported by all types:

`==`

: equality (case-sensitive when comparing text)`!=`

: inequality (case-sensitive when comparing text)`<`

: less than`>`

: greater than`<=`

: less than or equal to`>=`

: greater than or equal to`~~`

: case-insensitive and accentuation-insensitive equality (restricted to text comparison)`!~`

: inequality reversing`~~`

Ordering of values is the same for all Envision constructs (such as `order by`

, `rank`

or `median`

):

- numbers are sorted in ascending order
- dates are sorted in chronological order
`false < true`

- text values are sorted in alphabetical order (specifically, by Unicode code points)

## Numeric operators

The following numeric operators are supported:

`+`

: addition`-`

: subtraction`*`

: multiplication`/`

: division`/.`

: division hardened against division by zero,`a /. b`

returns 0 if`b == 0`

, and the regular division otherwise.`mod`

: remainder of the integer division`^`

: power

Some numeric operators can be used for dates:

`date - date`

is the number of days between two dates`date + number`

and`date - number`

adds or subtracts days to a date

## Logical operators

The following logical operators are supported:

`&`

: logical AND`|`

: logical OR`not`

: logical NOT`c ? a : b`

: the conditional operator, also referred to as the*ternary if*. Note that`a`

,`b`

and`c`

are first evaluated separately.

## Distribution operators

Distributions benefit from specific operators (see also algebra of distributions):

`+`

: point-wise addition`-`

: point-wise subtraction`*`

: point-wise multiplication`<<`

: left shift`>>`

: right shift

### Random variable operators

When distributions happen to be random variables (mass is equal to 1, no negative values), they benefit from specific operators:

`+*`

: additive convolution`-^`

: subtractive convolution`**`

: multiplicative convolution (Dirichlet convolution)`^*`

: convolution power

## Operator precedence

The operators below are listed in increasing order of precedence. For instance, since `&`

is before `|`

, then `A | B & C`

is interpreted as `A | (B & C)`

. Operators with the same precedence are grouped left-to-right: `A * B / C`

is `(A * B) / C`

.

`^`

,`^*`

,`>>`

,`<<`

`*`

,`/`

,`/.`

and`mod`

`-`

,`+`

,`+*`

,`-*`

,`**`

`<`

,`<=`

,`==`

,`!=`

,`~~`

,`!~`

,`>`

,`>=`

,`~~`

and`!~`

`not`

`&`

`|`