Princip je jednoduchý. V podstatě se vytvoří kód (po sobě jdoucí
příkazy ohraničené složenou závorkou), kterému přidělíme nějaký
název. Kdykoliv pak po zadefinování je možné tento kód zavolat a tím
v podstatě zavolat naši funkci. Funkci lze navíc zavolat i s parametry,
což si ukážeme na následujícím příkladu:

// ----- CELO_Dopln_Naloz
// ----- doplneni naloze do vybavy objektu
// ----- @param object objekt, kteremu se ma pridat naloz do vybavy
CELO_Dopln_Naloz = {
  _soldier = _this;
  try {
    if (isNil "_soldier") then {throw "neznamy objekt"};
    if (!alive _soldier) then {throw "neni nazivu"};
    if (!(_soldier isKindOf "Man")) then {throw "neni clovek"};
    _soldier addmagazine "pipebomb";
  } catch {
    switch (_exception) do {
      case "neznamy objekt": {
       // -- chybny stav
      };
      case "neni clovek": {
        _this addmagazinecargo ["pipebomb",1];
      };
      case "neni nazivu": {
       // -- nezije, neni duvod pridavat naloz
      };
      default {
        hint "neznama vyjimka";
      };
    };
  };
};

Tento kód, který jsme si pojmenovali jako CELO_Dopln_Naloz je
možné kdykoliv po zadefinovaní za pomoci příkazu call nebo
spawn zavolat v závislosti na tom, zda chceme (call) či
nechceme (spawn) čekat na dokončení této funkce.

nul = player call CELO_Dopln_Naloz;

Naši funkci můžeme předávat parametry všech možných typů.
V předchozím příkladě šlo o objekt. Uveďme si teď příklad funkce,
která bude pracovat s více parametry předanými funkci jako pole.

// ----- CELO_Vysadek
// ----- necha vyskocit vsechny osoby z dopravniho prostredku
// ----- @param array seznam vojaku, ktere se maji vysazovat
// ----- @param object dopravni prostredek, ze ktereho se maji jednotky vysazovat.
// ----- @param integer casova prodleva mezi vysadkem
CELO_Vysadek = {

  _soldiers = _this select 0;
  _car      = _this select 1;
  _interval = _this select 2;

  try {
    if (isNil(_soldiers) or !(typeName _soldiers=="ARRAY")) then {throw "spatny parametr _soldiers"};
    if (isNil(_car) or !(typeName _car=="OBJECT")) then {throw "spatny parametr _car"};
    if (isNil(_interval) or !(typeName _interval=="SCALAR")) then {throw "spatny parametr _interval"};

    {
      if ((typeName _x=="OBJECT") and (_x in _car)) then {
        unassignvehicle _x;
        _x action ["EJECT",_car];
        sleep _interval;
      };
    } foreach _soldiers;

  } catch {

    if (debug) then {

      switch (_exception) do {
        case "spatny parametr _soldiers": {
         hint "spatne definovany prvni parametr pro CELO_Vysadek. Ocekavano je pole vojaku";
        };
        case "spatny parametr _car": {
         hint "spatne definovany druhy parametr pro CELO_Vysadek. Ocekavan je dopravni prostredek.";
        };
        case "spatny parametr _interval": {
         hint "spatne definovany treti parametr pro CELO_Vysadek. Ocekavan je casovy rozestup.";
        }
        default {
         hint "neznama vyjimka";
        };
      };

    };

  };

};

// --- x tisic radku kodu

nul = [units soldier1,heli1,2] spawn CELO_Vysadek;

Jak je vidět, tak po spuštění se zadefinuje kód (neboli funkce
CELO_Vysadek, který o x tisíc řádků později zavoláme se třemi parametry
předanými v poli. Výsledkem bude, že všechny jednotky (respektive objekty)
ze skupiny, do které patří objekt soldier1 jsou vysazeny z objektu
pojmenovaného jako heli1 ve dvouvteřinovém intervalu. Skript ze kterého
došlo ke spuštění nečeká na dokončení a pokračuje v provádění
následujících příkazů (díky příkazu spawn).