|
|
(66 intermediate revisions by 3 users not shown) |
Line 1: |
Line 1: |
| __TOC__
| |
| <code style="display: inline; margin: 0px; padding: 2px;">Status Quo Function</code> is the successor of <code style="display: inline; margin: 0px; padding: 2px;">[[SQS_syntax|Status Quo Script]]</code> 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 [[Category:Scripting_Commands_Arma_3|scripting commands]]).
| |
| 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 [[Variables|Global Variable]], but it is important to differentiate!
| |
|
| |
| Consider following example in a mission with eg. 5 units:
| |
| {{codecomment|//Put the result of [[allUnits]] into a [[Variables|variable]].}}
| |
| _unitsArray = [[allUnits]];
| |
| {{codecomment|//Display the current array size using [[systemChat]].}}
| |
| [[systemChat]] [[str]] [[count]] _unitsArray;
| |
| {{codecomment|//Create a new unit in the player group.}}
| |
| [[group]] [[player]] [[createUnit]] ["B_RangeMaster_F", [[position]] [[player]], [], 0, "FORM"];
| |
| {{codecomment|//Output the array size again}}
| |
| [[systemChat]] [[str]] [[count]] _unitsArray;
| |
| {{codecomment|//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, <code style="display: inline; margin: 0px; padding: 2px;">_unitsArray</code> was not automatically updated. If [[allUnits]] was a [[Variables|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 (<code style="display: inline; margin: 0px; padding: 2px;">unary <argument></code>). They always will take the first argument that occurs.
| |
|
| |
| A common mistake would be the following:
| |
| {{codecomment|//Create some array containing three arrays.}}
| |
| _arr = [[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2]];
| |
| {{codecomment|//Wrongly use the [[select]] command to get the count of the third array.}}
| |
| [[count]] _arr [[select]] 2; {{codecomment|//Error}}
| |
|
| |
| Now, what went wrong?
| |
|
| |
| Let's put some brackets in the right places to make the mistake understandible:
| |
| ([[count]] _arr) [[select]] 2; {{codecomment|//Error}}
| |
|
| |
| Due to the nature of Unary operators, count instantly consumes our [[Variables|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 <code style="display: inline; margin: 0px; padding: 2px;">_arr select 2</code> in brackets.
| |
| The correct code thus would be:
| |
| {{codecomment|//Create some array containing three arrays.}}
| |
| _arr = [[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2]];
| |
| {{codecomment|//Use Brackets to correctly get count of the third array.}}
| |
| [[count]] (_arr [[select]] 2); {{codecomment|//Good :)}}
| |
|
| |
|
| |
|
| |
| === Binary Operators ===
| |
| Binary Operators expect two arguments (<code style="display: inline; margin: 0px; padding: 2px;"><1st argument> binary <2nd argument></code>) and are executed according to their [[#precedence|precedence]]. If their [[#precedence|precedence]] is equal, they are executed left to right.
| |
|
| |
| As example, we will look into the following Expression:
| |
| {{codecomment|//Create a nested [[Array]] with 5 levels.}}
| |
| _arr = [[[[[1]]]]];
| |
| {{codecomment|//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 [[a_*_b|*]] and [[a_/_b|/]] are executed first which matches their [[#precedence|precedence]]. Afterwards, the [[a_plus_b|+]] and [[a_minus_b|-]] operators will get executed followed by our [[select]] commands, which are executed from the left to the right.
| |
| == <span id="precedence">Rules Of Precedence</span> ==
| |
|
| |
| {|
| |
| |1 '''Lowest Precedence'''
| |
| |<code>[[a or b|<nowiki>||</nowiki>]] [[a or b|or]]</code>
| |
| |-
| |
| |2
| |
| |<code>[[and|&&]] [[and]]</code>
| |
| |-
| |
| |3
| |
| |<code>[[==]] [[!=]] [[a_greater_b|>]] [[a_less_b|<]] [[a_less=_b|>=]] [[a_less=_b|<=]] [[config_greater_greater_name|>>]]</code>
| |
| |-
| |
| |4
| |
| |''ALL BINARY OPERATORS''
| |
| |-
| |
| |5
| |
| |<code>[[else]]</code>
| |
| |-
| |
| |6
| |
| |<code>[[a_plus_b|+]] [[a_minus_b|-]] [[max]] [[min]]</code>
| |
| |-
| |
| |7
| |
| |<code>[[a_*_b|*]] [[a_/_b|/]] [[mod|%]] [[mod]] [[atan2]]</code>
| |
| |-
| |
| |8
| |
| |<code>[[a_^_b|^]]</code>
| |
| |-
| |
| |9
| |
| |''ALL UNARY OPERATORS''
| |
| |-
| |
| |10 '''Highest Precedence'''
| |
| |''ALL NULAR OPERATORS, VARIABLES, VALUES OR BRACED EXPRESSIONS''
| |
| |}
| |
|
| |
| <!-- [[Category: Syntax]] [[Category:Scripting Topics]] -->
| |