Skip to content

Expressions

SurgeScript supports many kinds of expressions. Expressions may involve strings, numbers or booleans. Let's study each case:

Constants

Constants are types of expressions. They may be numbers, strings, booleans... You may attribute constant values to variables using the assignment operator (=):

// strings
name = "Surge"; // variable name receives string "Surge"
message = "Surge's home";
otherMessage = 'Single-quoted strings are also allowed';

// numbers
weight = 35;
speed = 42.2;

// booleans
like = true;
crazy = false;

// null
next = null;

Arithmetic operators

SurgeScript can perform basic arithmetic. The operators are as follows:

Operator Meaning
+ Addition
- Subtraction
* Multiplication
/ Division
% Remainder

The multiplication, division and remainder operators have precedence over the addition and the subtraction operators.

Examples:

two = 1 + 1;
ten = 5 * 2;
eleven = 5 * 2 + 1;
four = two * two;
fifteen = eleven + four;
three = fifteen / 5;
positive = +5;
negative = -1;
zero = 15 - 10 - 5;
one = 15 - (10 + 4);
twelve = (2 + 2) * 3;
prime = -(-15 + 8);
seven = 5 + 5 % 3;
negativeTwo = -5 % 3;

Comparison operators

Comparison operators compare two operands.

Operator Meaning
== Equality operator
!= Inequality operator
< Less than
<= Less or equal
> Greater than
>= Greater or equal
=== Strong equality
!== Strong inequality

Examples:

x = 1;
y = (x == 1); // y is true
z = (x != 1); // z is false
w = x > 1; // w is false
t = x >= 1; // t is true

Pay attention!

Notice that the equality operator, used for comparing expressions for equality, is ==. Pay attention! Don't confuse the equality operator (==) with the assignment operator (=). The expression (x = 1) always evaluates to 1, whereas (x == 1) is true only if x equals 1.

Strong equality

Unlike their counterparts, strong equality/inequality operators compare not only the content of the operands, but also their type. While "1" == 1 evalutes to true, "1" === 1 does not.

Logical operators

Logical operators involve booleans (true or false values). While the not operator requires only one operand, operators and and or require two.

Operator Meaning
&& and
|| or
! not

The table below summarizes the basic logical expressions:

Expression Result
a && b true only if both a and b are true
a || b true if a is true or b is true
!a true if a is false, false if a is true

Notice that not has higher precedence than the other two operators. Examples:

x = 5 < 2; // evaluates to false
y = !x; // evaluates to true
z = 18 < 35 || x; // evaluates to true
w = (z && x) || true; // evaluates to true
t = !x && x; // evaluates to false

Short-circuit evaluation

SurgeScript performs short-circuit evaluation in and and or operations. This means that the second operator is not evaluated if the first alone is sufficient to determine the value of the operation. Example: in the expression a || b, expression b is not evaluated if a is evaluated to true. Similarly, in a && b, expression b is not evaluated if a is evaluated to false.

Textual expressions

You may concatenate strings with the + operator. Example:

message = "Surge" + " rocks!"; // evaluates to "Surge rocks!"

Other data types, such as numbers and booleans, may also be implicitly converted to strings when using this feature. Example:

group = "Jackson " + 5; // evaluates to "Jackson 5"

Assignment operators

The attribution operator (=) may be used to attribute data to variables. However, there's more to it. The expression variable = "data" is itself evaluated to string "data".

Likewise, the expression variable = variable + 5 is evaluated to the new value of the variable and may be shortened to variable += 5.

Let's see what kind of assignment expressions we have:

Expression Translates to Meaning
x = value x = value Assigns value to x
x += value x = x + value Adds value to x
x -= value x = x - value Subtracts value from x
x *= value x = x * value Multiplies x by value
x /= value x = x / value Divides x by value
x %= value x = x % value Sets x to the remainder of x / value

Example:

language = "Surge";
language += "Script";
// language now evaluates to "SurgeScript"

number = 5;
number += 2;
// number now evaluates to 7

Increment and decrement

Increment and decrement operators should be used only on numeric variables.

Expression Meaning
x++ Increments x by 1 and returns the old value of x
x-- Decrements x by 1 and returns the old value of x
++x Increments x by 1 and returns the new value of x
--x Decrements x by 1 and returns the new value of x

Example:

x = 1;   // x is 1
y = x++; // y is 1
z = ++x; // z is 3
w = --x; // w is 2
t = --x; // t is 1
Console.print(x); // prints 1

Chained expressions

You may chain assignment operations:

x = y = z = 1;

Commas

The comma operator takes two operands. It first evaluates the first operand and then discards the result. Next, it evaluates the second operand and then returns this result. The comma is the operator with the lowest precedence.

c = (1, 2); // Results in c = 2
a = 1, b = 2, c = 3; // Results in a = 1, b = 2 and c = 3
d = (c++, a); // Results in c = 4, d = 1
e = (++a, f = 2, 3); // Results in a = 2, e = 3, f = 2

Other expressions

this

The keyword this represents the object in which it appears. Example:

this.destroy(); // destroys this object

typeof

The expression typeof(expr) (or simply typeof expr) is evaluated to a string corresponding to the type of expr. The possible types are: number, string, boolean, object or null. Example:

t = typeof 5; // t will hold the string "number"

timeout

The expression timeout(seconds) is a handy feature of SurgeScript. It is evaluated to true if the object has been on the same state for the specified amount of time or more. It can only be used inside states. Example:

object "Application"
{
    state "main"
    {
        if(timeout(2.0)) {
            Console.print("2 seconds have passed");
            state = "done";
        }
    }

    state "done"
    {
    }
}