call: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "\|game([0-9]) ?= (.+) \|version([0-9]) ?= (.+) " to "|game$1= $2 |version$3= $4 ")
No edit summary
Line 52: Line 52:


|seealso= [[spawn]] [[execVM]] [[canSuspend]] [[compile]] [[compileScript]] [[preprocessFile]] [[remoteExec]] [[remoteExecCall]]
|seealso= [[spawn]] [[execVM]] [[canSuspend]] [[compile]] [[compileScript]] [[preprocessFile]] [[remoteExec]] [[remoteExecCall]]
}}
{{Note
|user= Leopard20
|timestamp= 20211105105249
|text= Contrary to a widespread misconception in the community, [[call]] doesn't necessarily execute the code in the [[Scheduler#Unscheduled_Environment|Unscheduled Environment]]. [[call|Call]] simply means: "execute the code here", just like how you execute a code using [[then]] ({{ic|[[if]] ([[true]]) then code}}) or [[do]]. Therefore it doesn't change the environment:
{{{!}} class="wikitable"
{{!}}-
! [[call]] Executed In Environment: !! Resulting Environment:
{{!}}-
{{!}} Scheduled {{!}}{{!}} Scheduled
{{!}}-
{{!}} Unscheduled {{!}}{{!}} Uncheduled
{{!}}}
This means that doing something like this (which is misused very often):
<code>_handle {{=}} _params [[spawn]] MY_fnc_Function;
[[waitUntil]] {[[scriptDone]] _handle};</code>
is not needed, because a lot of performance would be wasted compared to simply doing this:
<code>_params [[call]] MY_fnc_Function;</code>
which does the exact same thing as the previous code, except no new ''"scheduler thread"'' is created and the function executes seamlessly, plus the added performance benefit as mentioned before.<br>
If it is necessary to execute a code in the [[Scheduler#Unscheduled_Environment|Unscheduled Environment]], one can use [[isNil]] instead:
<code>[[isNil]] {_params [[call]] MY_fnc_Function}</code>
}}
}}

Revision as of 11:52, 5 November 2021

Hover & click on the images for description

Description

Description:
Adds given set of compiled instructions to the current stack and waits for it to finish and return, provides an option to pass arguments to the executed Code. See Scheduler to learn more about how the code is excuted and behaves.
Groups:
Program Flow

Syntax

Syntax:
call code
Parameters:
code: Code - Compiled instructions. In Operation Flashpoint this command also accepts datatype string
Return Value:
Anything - The last value given in the function is returned. See the topic Function for more information.

Alternative Syntax

Syntax:
args call code
Parameters:
args: Anything - Arguments that are passed to the function in the _this variable
code: Code - Compiled instructions. In Operation Flashpoint this command also accepts datatype string
Return Value:
Anything - The last value given in the function is returned. See the topic Function for more information.

Examples

Example 1:
call { hint str 123; };
Example 2:
123 call { hint str _this; };
Example 3:
_sum = [1, 2] call { (_this select 0) + (_this select 1); }; hint str _sum; // displays 3
Example 4:
123 call compile "hint str _this;";
Example 5:
_result = 123 call compile preprocessFileLineNumbers "myFile.sqf";

Additional Information

See also:
spawn execVM canSuspend compile compileScript preprocessFile remoteExec remoteExecCall

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
Leopard20 - c
Posted on Nov 05, 2021 - 10:52 (UTC)
Contrary to a widespread misconception in the community, call doesn't necessarily execute the code in the Unscheduled Environment. Call simply means: "execute the code here", just like how you execute a code using then (if (true) then code) or do. Therefore it doesn't change the environment:
call Executed In Environment: Resulting Environment:
Scheduled Scheduled
Unscheduled Uncheduled

This means that doing something like this (which is misused very often): _handle = _params spawn MY_fnc_Function; waitUntil {scriptDone _handle}; is not needed, because a lot of performance would be wasted compared to simply doing this: _params call MY_fnc_Function; which does the exact same thing as the previous code, except no new "scheduler thread" is created and the function executes seamlessly, plus the added performance benefit as mentioned before.
If it is necessary to execute a code in the Unscheduled Environment, one can use isNil instead: isNil {_params call MY_fnc_Function}