# Arithmetic, Logical and Comparison Operators

Here is a list of the available operators in a SIL™ program and detailed usage information.

# Arithmetic operators

In version 2.5 (and 3.0 yet again) we have reworked the way operators handle different types and conversions by putting an emphasis on the left-hand side (LHS) value of the operation. Consequently, only the right-hand side (RHS) operand will be converted (if necessary) to a type that is valid for the current operation with the LHS type.

For each operator and LHS type, we define two lists: valid types and convertible types. The list of convertible types is based on Type Conversion. This creates three cases:

1. If the RHS type is one of the valid types, then the operation will proceed as it is and the result calculated according to the table below.

2. If the RHS type is one of the convertible types, then it will attempt to convert it to one of the valid types (in the order the valid types are presented in the table below) until the conversion succeeds and then proceeds according to case 1.

3. If the RHS type is neither valid nor convertible, the program will end in error.

+

number

number

number

integer

number

integer

integer

integer

number

integer

string

string

string

adds the string representation of the RHS operand at the end of the LHS string

boolean

Unsupported

date

interval

date

adds the interval to the date and returns the result

interval

interval

interval

adds the two intervals and returns the result

date

date

adds the interval to the date and returns the result

<type> []

<type>

<type> []

adds the RHS value to the LHS array, where <type> can be any type.

-

number

number

number

standard subtraction of numbers

integer

number

standard subtraction of numbers

integer

integer

integer

standard subtraction of integers

number

integer

standard subtraction of integers

string

string

string

removes all occurrences of the RHS string in the LHS value

boolean

Unsupported

date

date

interval

returns the interval difference between the two dates

interval

date

subtracts the RHS interval from the date and returns the value

interval

interval

interval

standard interval subtraction

<type>[]

<type>

<type>[]

removes the first occurrence of the RHS value from the array; <type> can be any type.

*

number

number

number

standard multiplication of numbers

integer

number

standard multiplication of numbers

interval

interval

multiplies the interval by the number of times specified by the LHS operand and returns the result

number []

number

number []

multiplies each value in the LHS array with the number in the RHS operand and returns the result

integer

number []

multiplies each value in the LHS array with the integer in the RHS operand and returns the result

integer

integer

integer

standard multiplication of integers

number

integer

standard multiplication of integers

interval

interval

multiplies the interval by the integer of times specified by the LHS operand and returns the result

integer []

integer

integer []

multiplies each value in the LHS array with the integer in the RHS operand and returns the result

number

integer []

multiplies each value in the LHS array with the number in the RHS operand and returns the result

string

Unsupported

boolean

Unsupported

date

Unsupported

interval

number

interval

multiplies the interval by the number of times specified by the RHS operand and returns the result

<type>[]

(except number)

Unsupported

/

number

number

number

standard division of numbers

integer

number

standard division of numbers

number []

number

number []

divides each value in the LHS array by the number in the RHS operand and returns the result

integer

number []

divides each value in the LHS array by the integer in the RHS operand and returns the result

integer

integer

integer

standard division of integers

number

integer

standard division of integers

integer []

integer

integer []

divides each value in the LHS array by the integer in the RHS operand and returns the result

number

integer []

divides each value in the LHS array by the number in the RHS operand and returns the result

string

Unsupported

boolean

Unsupported

date

Unsupported

interval

number

interval

divides the interval by the number specified in the RHS operand

<type>[]

(except number)

Unsupported

%

number

number

number

standard modulo division of numbers

integer

number

standard modulo division of numbers

number []

number

number []

applies the modulo operator on each number in the LHS array with the number in the RHS operand and returns the results

integer

number []

applies the modulo operator on each number in the LHS array with the integer in the RHS operand and returns the results

integer

integer

integer

standard modulo division of integers

number

integer

standard modulo division of integers

integer []

integer

integer []

applies the modulo operator on each number in the LHS array with the integer in the RHS operand and returns the results

number

integer []

applies the modulo operator on each number in the LHS array with the number in the RHS operand and returns the results

string

Unsupported

boolean

Unsupported

date

Unsupported

interval

Unsupported

<type>[]

(except number)

Unsupported

You can also use the combined forms of the arithmetic operators with the attrib operator: +=, -=, *= and /=.

```1 2 3 4 ``````string s = "a"; s = s + "b"; // is equivalent with s += "b"; ```

Numbers also support the pre/post increment/decrement operators.

```1 2 3 4 ``````--i; i--; ++i; i++;```

# Comparison operators

== (alias 'eq')

Right operand will be casted to the left operand's type if their types are different

true/false

Returns true if the values are equal and false otherwise.

!= (alias 'neq')

Right operand will be casted to the left operand's type if their types are different

true/false

Returns false if the values are equal and true otherwise.

< (alias 'lt')

Right operand will be casted to the left operand's type if their types are different

true/false

Returns true if the first value is lower than the second one and false otherwise.

> (alias 'gt')

Right operand will be casted to the left operand's type if their types are different

true/false

Returns true if the first value is greater than the second one and false otherwise.

<= (alias 'le')

Right operand will be casted to the left operand's type if their types are different

true/false

Returns true if the first value is lower then or equal to the second one and false otherwise.

>= (alias 'gt')

Right operand will be casted to the left operand's type if their types are different

true/false

Returns true if the first value is greater than or equal to the second one and false otherwise.

# Logical operators

&& (alias 'and')

boolean && boolean

true/false

Logical "and"

|| (alias 'or')

boolean || boolean

true/false

Logical "or"

! (alias 'not')

boolean

true/false

Logically complements of the specified boolean.

! (alias 'not')

number

number

Complements the number in relation to 0. (returns number * -1)

# Ternary operators

?:

boolean, <type>, <type>

<type>

```1 ````<condition> ? <ifTrueValue> : <ifFalseValue>`

If <condition> is true, returns <ifTrueValue>, otherwise returns <ifFalseValue>.

Note that <ifTrueValue> and <ifFalseValue> must have same type.

# The Indexing Operator

The basic use of the indexing operator (introduced in version 2.5) is to allow you to easily access the contents of a list.

##### General syntax
```1 2 3 ``````string [] arr = {"a", "b", "c"}; string contents = arr + arr + arr + arr; // as user friendly as arrayGetElement, if index is out of bounds, will return an empty value. arr = "d";```

Moreover, it allows you to create key-value lists (maps) and retrieve values from them by using a string inside the operator (instead of a number).

```1 2 3 4 5 6 ``````number [] map; map["one"] = 1; map["two"] = 2; print(map["one"]); // note that when used in a for-loop, map only has 2 elements: 1 and 2. The keys will be hidden. print(map); // will print 1|2```

When accessing a map as a list, the contents are retrieved in the order they were added. You can still use the operator with an integer value even on maps.

```1 2 3 4 5 6 7 ``````date [] days; days["yesterday"] = currentDate() - "1d"; // added as first element days["today"] = currentDate(); // added as second element days["tomorrow"] = currentDate() + "1d"; // added as third element if(days["today"] == days){ print("Today is the second element in the array"); // yes, this will be printed }```

The indexing operator can also be used with certain simple types (not arrays) and a specific value to provide additional functionality.

string

a number

Gets the character at the specified index in the string

string

Inserts a character at the specified index. If given a longer string, it will insert the first character of the string.

date

"DAY"

Gets the day of month from the date

integer

Unsupported

"MONTH"

Gets the month from the date

integer

Unsupported

"YEAR"

Gets the year from the date

integer

Unsupported

"HOUR"

Gets the hour (0-23) from the date

integer

Unsupported

"MINUTE"

Gets the minute (0-59) from the date

integer

Unsupported

"SECOND"

Gets the seconds (0-59) from the date

integer

Unsupported

"MILLISECOND"

Gets the milliseconds (0-999) from the date

integer

Unsupported

"WEEK"

Gets the week number within the current year

integer

Unsupported

"WEEKINMONTH"

Gets the week number within the current month

integer

Unsupported

"TOMILLIS"

Gets the current time as UTC milliseconds from the epoch.

integer

Unsupported

"DAYOFWEEK"

Gets the three letter format for the day of the week (e.g. "Mon", "Tue", "Wed" etc)

string

Unsupported

"MONTHNAME"

Gets the three letter format for the name of the month (e.g. "Jan", "Feb", "Mar", etc.)

string

Unsupported

interval

"WEEK"

Gets the number of whole weeks inside the interval (e.g. interval i = "1w 14d"; i["WEEK"] will return 3)

integer

Unsupported

"DAY"

Gets the number of whole days inside the interval (e.g. interval i = "1d 48h"; i["DAY"] will return 3)

integer

Unsupported

"HOUR"

Gets the number of whole hours inside the interval (e.g. interval i = "1h 120m"; i["HOUR"] will return 3)

integer

Unsupported

"MINUTE"

Gets the number of whole miuntes inside the interval (e.g. interval i = "1m 120s"; i["MINUTE"] will return 3)

integer

Unsupported

"SECOND"

Gets the number of seconds inside the interval (e.g. interval i = "1h 1m 3s"; i["SECOND"] will return 3)

integer

Unsupported

"TOMILLIS"

Gets the number of milliseconds inside the interval

integer

Unsupported