Files
Pasha Stetsenko 69c13568e6 docs: Added documentation for basic expressions in Jenny (#2256)
This PR describes variables and operators in the YarnSpinner language.
2023-01-08 10:53:38 +01:00

5.2 KiB

Operators

The operators are special symbols that perform common mathematical operations. For example, operator + performs summation, and thus we can write $x + $y to denote the sum of variables $x and $y. There are over 20 different operators in YarnSpinner, which can be loosely grouped into the following categories:

Operator types

Arithmetic

The arithmetic operators, have the same meaning as in regular math. These apply to numeric arguments (with the exception of + which can also be used with strings):

:align: left
:class: first-col-align-center
:header-rows: 1
:widths: 1 2 9

* - operator
  - name
  - notes
* - `+`
  - addition
  -
* - `-`
  - subtraction
  - Also, a unary minus
* - `*`
  - multiplication
  -
* - `/`
  - division
  - Division by `0` is not allowed, and will throw a runtime error if it occurs.
* - `%`
  - modulo
  - This operator can apply to both integer and decimal numbers, and it returns
    the remainder of integer division of two numbers. The right-hand side of
    `%` cannot be zero or a negative number, otherwise a runtime error will be
    thrown. The result of `x % y` is always a number in the range `[0; y)`,
    regardless of the sign of `x`.
* - `+`
  - concatenation
  - When applied to strings, the `+` operator simply glues them together. For
    example, `"Hello" + "World"` produces string `"HelloWorld"`.

Logical

The logical operators apply to boolean values. These operators can be written either in symbolic or word form -- both forms are equivalent:

:align: left
:class: first-col-align-center
:header-rows: 1
:widths: 1 2 9

* - operator
  - name
  - notes
* - `!`, `not`
  - logical NOT
  - This is a unary operator that inverts its operand: `!true` is `false`,
    and `!false` is `true`.
* - `&&`, `and`
  - logical AND
  - Returns `true` if both of its arguments are `true`.
* - `||`, `or`
  - logical OR
  - Returns `true` if at least one of its arguments is `true`.
* - `^`, `xor`
  - logical XOR
  - Returns `true` if the arguments are different, and `false` if they are
    the same.

Assignment

The assignment operators modify the value of a variable. The left-hand side of such an operator is the variable that shall be modified, the right-hand side is the expression of the same type as the variable on the left:

:align: left
:class: first-col-align-center
:header-rows: 1
:widths: 1 2 9

* - operator
  - name
  - notes
* - `=`, `to`
  - assign
  - `$var = X` stores the value of `X` into the variable `$var`
* - `+=`
  - increase
  - `$var += X` is equivalent to `$var = $var + X`
* - `-=`
  - decrease
  - `$var -= X` is equivalent to `$var = $var - X`
* - `*=`
  - multiply
  - `$var *= X` is equivalent to `$var = $var * X`
* - `/=`
  - divide
  - `$var /= X` is equivalent to `$var = $var / X`
* - `%=`
  - reduce modulo
  - `$var %= X` is equivalent to `$var = $var % X`

Unlike all other operators, the assignment operators do not produce a value. This means they cannot be used inside a larger expression, for example the following is invalid: 3 + ($x += 7). Instead, the assignment operators are only usable at the top level of commands such as <<set>>, <<declare>>, and <<local>>.

Relational

The relational operators compare various values. The first two operators in this list can be applied to operands of any types, as long as the types are the same. The remaining four operators can only be used with numbers. Regardless of the types of operands, the result of every relational operator is a boolean value, which can be either assigned to a variable, or used in a larger expression:

:align: left
:class: first-col-align-center
:header-rows: 1
:widths: 1 3 8

* - operator
  - name
  - notes
* - `==`
  - equality
  -
* - `!=`
  - inequality
  -
* - `<`
  - less than
  -
* - `<=`
  - less than or equal
  -
* - `>`
  - greater than
  -
* - `>=`
  - greater than or equal
  -

Note that operator chaining is not supported. Thus, for example, $x == $y == $z will first compare variables $x and $y, then the result of that comparison, which is either true or false, will be compared with variable $z. Given that such expressions would be highly confusing to a reader, we recommend against using them. If you need to compare that all three values $x, $y and $z are the same, then you should use the && operator instead: $x == $y && $x == $z.

Precedence

Just as in mathematics, the operators have precedence ordering among them, meaning that some operators will always evaluate before the others. For example, if you write 3 + 4 * 5, then the result will be 23 instead of 35 because multiplication has higher precedence than addition and thus evaluates first.

The precedence order is as follows, from highest to lowest:

  • *, /, %;
  • -, +;
  • ==, !=, <, <=, >=, >;
  • !;
  • &&, ^;
  • ||;
  • =, +=, -=, *=, /=, %=.

You can use parentheses () in order to alter the order of evaluation. For example, (3 + 4) * 5 is 35 instead of 23.