# DSL operators

## Detailed listing

Operators are listed on the [DSL built-in functions page](reference-dsl-builtin-functions.md).

## Operator precedence

Operators are listed in order of decreasing precedence, from highest to lowest.

| Operators                     | Associativity |
|-------------------------------|---------------|
| `()` `{}` `[]`                | left to right |
| `**`                          | right to left |
| `???`                         | left to right |
| `??`                          | left to right |
| `!` `~` unary`+` unary`-`     | right to left |
| `.`                           | left to right |
| `*` `/` `//` `%`              | left to right |
| binary`+` binary`-`           | left to right |
| `<<` `>>` `>>>`               | left to right |
| `&`                           | left to right |
| `^`                           | left to right |
| `|`                           | left to right |
| `<` `<=` `>` `>=`             | left to right |
| `==` `!=` `=~` `!=~` `<=>`    | left to right |
| `&&`                          | left to right |
| `^^`                          | left to right |
| `||`                          | left to right |
| `? :`                         | right to left |
| `=`                           |  N/A for Miller (there is no $a=$b=$c) |

See also the [section on parsing and operator precedence in the REPL](repl.md#parsing-and-operator-precedence) for information on how to examine operator precedence interactively.

## Operator and function semantics

* Functions are often pass-throughs straight to the system-standard Go libraries.

* The [`min`](reference-dsl-builtin-functions.md#min) and [`max`](reference-dsl-builtin-functions.md#max) functions are different from other multi-argument functions, which return null if any of their inputs are null: for [`min`](reference-dsl-builtin-functions.md#min) and [`max`](reference-dsl-builtin-functions.md#max), by contrast, if one argument is absent-null, the other is returned. Empty-null loses min or max against numeric or boolean; empty-null is less than any other string.

* Symmetrically with respect to the bitwise OR, AND, and XOR operators
[`|`](reference-dsl-builtin-functions.md#bitwise-or),
[`&`](reference-dsl-builtin-functions.md#bitwise-and), and
[`^`](reference-dsl-builtin-functions.md#bitwise-xor), Miller has logical operators
[`||`](reference-dsl-builtin-functions.md#logical-or),
[`&&`](reference-dsl-builtin-functions.md#logical-and), and
[`^^`](reference-dsl-builtin-functions.md#logical-xor).

* The exponentiation operator [`**`](reference-dsl-builtin-functions.md#exponentiation) is familiar from many languages, except that an integer raised to an int power is int, not float.

* The regex-match and regex-not-match operators [`=~`](reference-dsl-builtin-functions.md#regmatch) and [`!=~`](reference-dsl-builtin-functions.md#regnotmatch) are similar to those in Ruby and Perl.

## The double-purpose dot operator

The main use for the `.` operator is for string concatenation: `"abc" . "def"` is `"abc.def"`.

However, in Miller 6, it has an optional use for map traversal. Example:

GENMD-RUN-COMMAND
cat data/server-log.json
GENMD-EOF

GENMD-RUN-COMMAND
mlr --json --from data/server-log.json put -q '
  print $req["headers"]["host"];
  print $req.headers.host;
'
GENMD-EOF

This also works on the left-hand sides of assignment statements:

GENMD-RUN-COMMAND
mlr --json --from data/server-log.json put '
  $req.headers.host = "UPDATED";
'
GENMD-EOF

A few caveats:

* This is why `.` has higher precedence than `+` in the table above -- in Miller 5 and below, where `.` was only used for concatenation, it had the same precedence as `+`. So you can now do this:

GENMD-RUN-COMMAND
mlr --json --from data/server-log.json put -q '
  print $req.id + $res.status_code
'
GENMD-EOF

* However (awkwardly), if you want to use `.` for map-traversal as well as string-concatenation in the same statement, you'll need to insert parentheses, as the default associativity is left-to-right:

GENMD-RUN-COMMAND
mlr --json --from data/server-log.json put -q '
  print $req.method . " -- " . $req.path
'
GENMD-EOF

GENMD-RUN-COMMAND
mlr --json --from data/server-log.json put -q '
  print ($req.method) . " -- " . ($req.path)
'
GENMD-EOF
