Squirrel Operators: Difference between revisions

From SigMod
Jump to navigation Jump to search
No edit summary
No edit summary
Line 9: Line 9:


<span style="font-size:120%">'''Arithmetic'''</span>
<span style="font-size:120%">'''Arithmetic'''</span>
The arithmetic operators <code>'''+, -, *, /, %'''</code> are used for, well, arithmetic! Technically we can use them on certain object types (more on in future sections), however by default they're for use with the integer, float, and (partially) string types. You should be familiar with most of these already.


'''Unary Operators'''
'''Unary Operators'''
Line 72: Line 75:
</syntaxhighlight>
</syntaxhighlight>


The addition operators <code>'''+'''</code> and <code>'''+='''</code> are also able to handle string operands. If one operand is a string, Squirrel will try to convert the other operand to a string as well.
The addition operators <code>'''+'''</code> and <code>'''+='''</code> are the only operators able to handle string operands. If one operand is a string, Squirrel will try to convert the other operand to a string as well.
This same type conversion happens between floats and integers for any arithmetic operator (not just addition). If one operand is a float and the other an integer, the resulting value will be a float.
This same type conversion happens between floats and integers for any arithmetic operator (not just addition). If one operand is a float and the other an integer, the resulting value will be a float.


Line 89: Line 92:


<span style="font-size:120%">'''Assignment'''</span>
<span style="font-size:120%">'''Assignment'''</span>
The assignment operator (<code>'''='''</code>) is used for assigning values to variables. It can be combined with the arithmetic operators to create arithmetic assignment operators (e.g. <code>'''x += 5'''</code>), which is a shortened version of: <code>'''x = x + 5'''</code>.


{| class="wikitable" style="width:100%; margin:auto; text-align:center font-weight:bold; font-size:110%"
{| class="wikitable" style="width:100%; margin:auto; text-align:center font-weight:bold; font-size:110%"
Line 143: Line 149:


<span style="font-size:120%">'''Increment/Decrement'''</span>
<span style="font-size:120%">'''Increment/Decrement'''</span>
The increment and decrement operators are used (respectively) to increase or decrease a variable by 1. This can be done '''before''' the variable is returned in the case of the prefixed operators, or it can be done '''after''' the variable has been returned in the case of the postfixed operators.
{| class="wikitable" style="width:100%; margin:auto; text-align:center font-weight:bold; font-size:110%"
{| class="wikitable" style="width:100%; margin:auto; text-align:center font-weight:bold; font-size:110%"
|+
|+
Line 176: Line 186:


y = x++; // y = 1, it got the value of x and then x got incremented, x = 2
y = x++; // y = 1, it got the value of x and then x got incremented, x = 2
y = ++x; // y = 3, x got incremented and then y got x's value
y = ++x; // y = 3, x got incremented and then y got x's value, x = 3
</syntaxhighlight>
</syntaxhighlight>


Line 184: Line 194:


<span style="font-size:120%">'''Relational'''</span>
<span style="font-size:120%">'''Relational'''</span>
The relational operators compare the values of their operands and return a boolean based on their result.
{| class="wikitable" style="width:100%; margin:auto; text-align:center font-weight:bold; font-size:110%"
{| class="wikitable" style="width:100%; margin:auto; text-align:center font-weight:bold; font-size:110%"
|+
|+
Line 234: Line 248:
z = x <= y; // true
z = x <= y; // true
</syntaxhighlight>
</syntaxhighlight>
<hr>




<span style="font-size:120%">'''Logical'''</span>
<span style="font-size:120%">'''Logical'''</span>
The logical operators are primarily used in control flow to create condition based code. We'll go over control flow in a future section, for now just know that they exist and that you can reference back here if you forget what one does.
{| class="wikitable" style="width:100%; margin:auto; text-align:center font-weight:bold; font-size:110%"
{| class="wikitable" style="width:100%; margin:auto; text-align:center font-weight:bold; font-size:110%"
|+
|+
Line 247: Line 268:
| !
| !
| !x
| !x
|true if x evaluates to false, otherwise false
|true if x evaluates to false, otherwise true
|- style="text-align:center"
|- style="text-align:center"
|Logical AND
|Logical AND
Line 262: Line 283:
For most purposes the above definitions for AND & OR are sufficient, however Squirrel does not simply return boolean true or false for these operators, rather it returns a specific operand passed to the operator based on the result.
For most purposes the above definitions for AND & OR are sufficient, however Squirrel does not simply return boolean true or false for these operators, rather it returns a specific operand passed to the operator based on the result.


Logical AND will return the '''first''' operand that evaluates to false, if none do and both evaluate true the operator will return the '''last''' operand.
Logical AND will return the '''first''' operand that evaluates to '''false''', if none do, it will return the '''last''' operand.


Logical OR will return the first operand that evaluates to true, if none do, it will return the '''last''' operand.
Logical OR will return the '''first''' operand that evaluates to '''true''', if none do, it will return the '''last''' operand.




Line 276: Line 297:
local z = 5 && "0"        // "0"
local z = 5 && "0"        // "0"
</syntaxhighlight>
</syntaxhighlight>
<hr>


<span style="font-size:120%">'''Bitwise'''</span>
<span style="font-size:120%">'''Bitwise'''</span>


All data in computer memory is stored as sequences of bits; 0's and 1's. The bitwise operators work directly with the bits of variables and literals in Squirrel. These operators are rarely used unless you have very specific needs within your program. For day to day use, you're mostly going to be using bitwise AND & bitwise OR to manipulate '''bit flags''', which are variables where each of the 32 bits (or however big the variable is) represents a boolean flag. So instead of having 32 different boolean variables, you can have 1 variable that represents 32 booleans!
&, |, ^, ~, <<, >>, >>>
&, |, ^, ~, <<, >>, >>>



Revision as of 21:55, 27 October 2023

BACK
HOME
NEXT

Now that you know how to create data and store it into variables, we can now go over how to modify and operate on that data. Operators are used for this purpose, they take one or more operands and produce a result value. Operators which take one operand are called unary operators, two operands are binary operators, and three are ternary operators. This section is quite long so don't worry about memorizing every single operator, just browse through and become familiar with the various types of operators and their uses, you'll have plenty of examples throughout the rest of the guide to work with.




Arithmetic

The arithmetic operators +, -, *, /, % are used for, well, arithmetic! Technically we can use them on certain object types (more on in future sections), however by default they're for use with the integer, float, and (partially) string types. You should be familiar with most of these already.


Unary Operators

Operator Symbol Form Operation
Unary minus - -x Negation of x
local x = 50;
x = -x; // -50


Binary Operators

Operator Symbol Form Operation
Addition + x + y x plus y
Subtraction - x - y x minus y
Multiplication * x * y x multiplied by y
Division / x / y x divided by y
Remainder % x % y the remainder from: x divided by y
local v = 100 + 100; // 200
local w = 0 - 2;     // -2
local x = 5.5 * 100; // 550.0
local y = 20 / 2;    // 10
local z = 23 % 2;    // 1

The addition operators + and += are the only operators able to handle string operands. If one operand is a string, Squirrel will try to convert the other operand to a string as well. This same type conversion happens between floats and integers for any arithmetic operator (not just addition). If one operand is a float and the other an integer, the resulting value will be a float.

local str1 = "Hello,";
local str2 = " World!";
str1 += str2; // Hello World!
// See next section for +=

local float = 10 - 7.0 // 3.0




Assignment

The assignment operator (=) is used for assigning values to variables. It can be combined with the arithmetic operators to create arithmetic assignment operators (e.g. x += 5), which is a shortened version of: x = x + 5.


Operator Symbol Form Operation
Assignment = x = y assign value y to variable x
Addition Assignment += x += y assign x + y to variable x
Subtraction Assignment -= x -= y assign x - y to variable x
Multiplication Assignment *= x *= y assign x * y to variable x
Division Assignment /= x /= y assign x / y to variable x
Remainder Assignment %= x %= y assign x % y to variable x
local x = 100;
x += 5;   // equivalent to: x = x + 5
x -= 5;   // 100
x *= 100; // 10,000
x /= 2;   // 5,000
x %= 2;   // 0




Increment/Decrement

The increment and decrement operators are used (respectively) to increase or decrease a variable by 1. This can be done before the variable is returned in the case of the prefixed operators, or it can be done after the variable has been returned in the case of the postfixed operators.


Operator Symbol Form Operation
Pre-increment ++ ++x increment x by 1, then return x
Post-increment ++ x++ copy x, increment variable x by 1, then return the copy
Pre-decrement -- --x decrement x by 1, then return x
Post-decrement -- x-- copy x, decrement variable x by 1, then return the copy
local x = 1;
local y;

y = x++; // y = 1, it got the value of x and then x got incremented, x = 2
y = ++x; // y = 3, x got incremented and then y got x's value, x = 3




Relational

The relational operators compare the values of their operands and return a boolean based on their result.


Operator Symbol Form Operation
Equality == x == y true if x equals y, false otherwise
Inequality != x != y true if x does not equal y, false otherwise
Less than < x < y true if x is less than y, false otherwise
Greater than > x > y true if x is greater than y, false otherwise
Less than or equal to <= x <= y true if x is less than or equal to y, false otherwise
Greater than or equal to >= x >= y true if x is greater than or equal to y, false otherwise
local x = 5;
local y = 5;
local z;

z = x == y; // true
z = x != y; // false
z = x > y;  // false
z = x >= y; // true
z = x < y;  // false
z = x <= y; // true




Logical

The logical operators are primarily used in control flow to create condition based code. We'll go over control flow in a future section, for now just know that they exist and that you can reference back here if you forget what one does.


Operator Symbol Form Operation
Logical NOT ! !x true if x evaluates to false, otherwise true
Logical AND && x && y true if both operands evaluate to true, otherwise false
Logical OR || x || y true if either operand evaluates to true, otherwise false

For most purposes the above definitions for AND & OR are sufficient, however Squirrel does not simply return boolean true or false for these operators, rather it returns a specific operand passed to the operator based on the result.

Logical AND will return the first operand that evaluates to false, if none do, it will return the last operand.

Logical OR will return the first operand that evaluates to true, if none do, it will return the last operand.


Certain values evaluate to false, these are: false, null, 0, 0.0. Everything else evaluates to true.

local v = 0 && 1;         // 0
local w = null || "bark"; // "bark"
local x = "" || true;     // ""
local y = !0;             // true
local z = 5 && "0"        // "0"




Bitwise

All data in computer memory is stored as sequences of bits; 0's and 1's. The bitwise operators work directly with the bits of variables and literals in Squirrel. These operators are rarely used unless you have very specific needs within your program. For day to day use, you're mostly going to be using bitwise AND & bitwise OR to manipulate bit flags, which are variables where each of the 32 bits (or however big the variable is) represents a boolean flag. So instead of having 32 different boolean variables, you can have 1 variable that represents 32 booleans! &, |, ^, ~, <<, >>, >>>

Other Operators

in, instanceof, typeof, comma, ternary


Operator Precedence

-, ~, !, typeof , ++, -- highest /, *, % … +, - <<, >>, >>> <, <=, >, >=, instanceof ==, !=, <=> & ^ &&, in +=, =, -=, /=, *=, %= … , (comma operator) lowest

IntegerLiteral  ::= [1-9][0-9]* | '0x' [0-9A-Fa-f]+ | [.]+ | 0[0-7]+ FloatLiteral  ::= [0-9]+ '.' [0-9]+ FloatLiteral  ::= [0-9]+ '.' 'e'|'E' '+'|'-' [0-9]+ StringLiteral  ::= '"'[.]* '"' VerbatimStringLiteral ::= '@"'[.]* '"'