X39 – User talk
Status Quo Function
is the successor of Status Quo Script
which is deprecated since Armed Assault.
Language Structure
The SQF Language is fairly simple in how it is built. In fact: there are barely any actual language structures at all.
The functionality is provided via so called operators (or more commonly known). Those operators are one of the following types: Nular, Unary or Binary.
Nular Operators
A Nular Operator is more or less a computed variable. Each time accessed, it will return the current state of something. It is tempting to think of a Nular Operator as nothing more but a magic Global Variable, but it is important to differentiate!
Consider following example in a mission with eg. 5 units:
//Put the result of allUnits into a variable. _unitsArray = allUnits; //Display the current array size using systemChat. systemChat str count _unitsArray; //Create a new unit in the player group. group player createUnit ["B_RangeMaster_F", position player, [], 0, "FORM"]; //Output the array size again systemChat str count _unitsArray; //Output the size of allUnits systemChat str count allUnits;
Now, what would the output of this look like?
System: 5 System: 5 System: 6
As you can see, _unitsArray
was not automatically updated. If allUnits was a Global Variable, our private variable should have had reflected the change.
The reason for this is because allUnits and other Nular commands just return the current state of something and do not return a reference to eg. an Array containing all units.
It is generated each time, which is why some of theese commands are more expensive to run then just using a variable.
Unary Operators
The Unary Operators are operators that expect an argument on their right side (unary <argument>
). They always will take the first argument that occurs.
A common mistake would be the following:
//Create some array containing three arrays. _arr = [[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2]]; //Wrongly use the select command to get the count of the third array. count _arr select 2; //Error
Now, what went wrong?
Let's put some brackets in the right places to make the mistake understandible:
(count _arr) select 2; //Error
Due to the nature of Unary operators, count instantly consumes our variable _arr and returns the number 3. The 3 then is passed to select which does not knows what to do with a number as left argument and thus errors out.
To do it correctly, one would have to put the _arr select 2
in brackets.
The correct code thus would be:
//Create some array containing three arrays. _arr = [[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2]]; //Use Brackets to correctly get count of the third array. count (_arr select 2); //Good :)
Binary Operators
Binary Operators expect two arguments (<1st argument> binary <2nd argument>
) and are executed according to their precedence. If their precedence is equal, they are executed left to right.
As example, we will look into the following Expression:
//Create a nested Array with 5 levels. _arr = [[[[[1]]]]]; //Receive the nested number with some random math expressions. _arr select 0 select 1 - 1 select 15 / 3 - 5 select 0 select 10 * 10 + 4 * 0 - 100
Now, let us analyze why this is happening for the first few expressions:
- _arr is loaded
- 0 is loaded
- select is executed with the result of 1. & 2.
- 1 is loaded
- 1 is loaded
- [a_minus_b|-] is executed with the result of 4. & 5.
- select is executed with the result of 3. & 6.
- ...
If we now would put brackets at the correct spots, the expression will get more clear:
((((_arr select 0) select (1 - 1)) select ((15 / 3) - 5)) select 0) select (((10 * 10) + (4 * 0)) - 100)
As you can see the * and / are executed first which matches their precedence. Afterwards, the + and - operators will get executed followed by our select commands, which are executed from the left to the right.
Rules Of Precedence
1 Lowest Precedence | || or
|
2 | && and
|
3 | == != > < >= <= >>
|
4 | ALL BINARY OPERATORS |
5 | else
|
6 | + - max min
|
7 | * / % mod atan2
|
8 | ^
|
9 | ALL UNARY OPERATORS |
10 Highest Precedence | ALL NULAR OPERATORS, VARIABLES, VALUES OR BRACED EXPRESSIONS |