Sfairadora

  • Referenční příručka

Odkazy na data

Funkce v jazyce Enki jsou obecně obsaženy buď v definici nějakého dispelu nebo datové položky. Z dané funkce pak lze přistupovat ke všem datům, které jsou dostupné danému dispelu či datové položce.
K datům vnějším dané funkci se přistoupí tak, že se zapíše název objektu, ve kterém je požadovaná datová položka a případně se za tečku připojí reference na datovou položku v rámci tohoto objektu. Je-li například v sekci dokumentu Data tabulka s názvem table, lze se k ní odkázat z Enki takto:
document.data.tabulka
Některé názvy objektů jsou nepovinné, takže je není třeba zadávat. Například místo this.x stačí psát x. Zda je název objektu povinný či nikoli lze například zvolit u lokálních proměnných definovaných v poskytovateli dat.
Názvem objektu může být i proměnná definovaná konstrukcí var.

Identifikace prvku sekvence

Reference na data tedy sestává z posloupnosti názvů složek struktur oddělených tečkami. Pokud je třeba identifikovat prvek pole či sekvence, zadá se místo jména index (první prvek pole či sekvence má index 0). Ekvivalentně lze použít zápis indexu do hranatých závorek, jak je běžné v mnohých jiných programovacích jazycích. Například:
document.data.tabulka.0.jméno
odkazuje na stejnou položku (prvek name prvního řádku tabulky table v datech dokumentu), jako:
document.data.tabulka[0].jméno

Pojem l-hodnoty

Referencí na data je identifikována datová položka, jejíž hodnotu lze nejen použít pro výpočet, ale také změnit. Tím se liší od konstant a výsledků funkcí, které představují pouhé hodnoty. Reference naproti tomu identifikují objekty (proměnné, datové položky), do nichž lze hodnoty ukládat. Hodnotu, která identifikuje objekt (jehož hodnotu lze měnit) se nazývá l-hodnota (od left – taková hodnota může stát na levé straně operátoru přiřazení). Pouhé prosté hodnoty se potom nazývají r-hodnoty. Každou l-hodnotu lze použít na místě r-hodnoty – na r-hodnotu se změní načtením aktuální hodnoty uložené v identifikovaném objektu.

Dynamické určení prvku sekvence

Ve výše uvedeném příkladu jsme vytvořili referenci na první prvek sekvence. Mnohdy je však třeba odkazovat na prvek sekvence, jehož index (pořadové číslo) je výsledkem výpočtu. Pro další příklady předpokládejme, že i je celočíselná proměnná. Chceme-li odkázat na i-tý prvek sekvence, stačí proměnnou (či celý výraz) zapsat do hranatých závorek:
document.data.tabulka[i].jméno
Zápis s tečkovou notací zapsaný document.data.tabulka.i.jméno by nefungoval, protože by označoval složku s názvem i, která v sekvenci table není přítomna. Aby se rozlišilo, že nejde o přímý název, ale o název proměnné či celý výraz, je třeba dá počítanou položku reference do kulatých závorek:
document.data.tabulka.(i).jméno

Dynamické určení libovolné části reference

Výše popsaný princip dynamického určování indexu sekvence lze obecně použít na dynamické určení libovolné složky reference. K tomu slouží dva datové typy:
Atom
jedno jméno v referenci. Hodnotu tohoto typu lze vytvořit typovou konverzí z řetězce. Například: [Atom]"jméno".
Dref
hodnota reprezentující část nebo celou referenci, tj. jeden nebo více atomů. Hodnotu tohoto typu lze vytvořit typovou konverzí z řetězce. Například: [Dref]"table.0.jméno".
Oba typy lze naopak převést zpět na řetězec.
Operátorem tečka lze potom zřetězit vypočtenou hodnotu typu Atom či Dref s jinou referencí. Například:
var Atom sloupec = [Atom]"jméno";
document.data.tabulka.0.(sloupec)
Opět je třeba dát počítanou položku do závorek, aby se odlišila od přímého názvu datové položky.
Obdobně pro typ Dref:
var Dref prvek = [Dref]"table.0";
document.data.(prvek).jméno

Přechod mezi l-hodnotami a typem Dref

Je-li hodnotou typu Dref určena celá reference, lze získat odpovídající l-hodnotu operátorem hvězdička (*):
var Dref prvek = [Dref]"document.data.tabulka.0.jméno";
*prvek = "Jan Novák";
Naopak z l-hodnoty lze získat hodnotu typu Dref operátorem ampersand (&):
var Dref prvek = &document.data.tabulka.0.jméno
To může být zvlášť užitečné u parametrů předaných odkazem (viz editor funkce), kde lze získanou hodnotu typu Dref dále převést na řetězec a analyzovat.

Deklarace dat

Ve většině případů je z kontextu umístění funkce známé, která vnější data jsou funkci dostupná. V některý případech (např. v definici nástrojů) tomu tak být nemusí. Potom může být potřeba překladači jazyka Enki oznámit, že se očekává, že určitá data budou za běhu dostupná a případně jaký mají typ. K tomu slouží konstrukce declare:
declare Typ název
Pokud typ není přesně znám, stačí jej nastavit na Union, což je sjednocení všech typů (tj. jakýkoli typ).