
V jednom z prvních článků jsme si řekli, že budeme používat jazyk, který běží nativně jak na PHP serveru, tak i v prohlížeči. V dalším jsme si tento jazyk zvolili i jako makrojazyk CADu. Teď nastal čas si ho specifikovat:
Specifikace
- Stejný skript funguje jak na PHP serveru, tak v browseru
To znamená, že tentýž soubor můžeme jednou vložit pomocíinclude
a podruhé použít jakosrc
v tagu<script>
. - V PHP i v JS vrací stejné výsledky
- Jazyk obsahuje funkce pro práci s čísly, řetězci a boolean hodnotami
- Podpora číselně indexovaných polí – takových, jaké známe z JS pomocí
[]
- Podpora asociativních polí – důležitá vlastnost pro pohodlnou práci. Pole navíc udrží pořadí prvků.
- Přístup k prvkům pole bude klasicky přes [...]. Konstrukce jako SetItem($Arr, $Key, $Val) nebo $Val = GetItem($Arr, $Key) jen zdržují a zbytečně komplikují zápis.
- Jednoduchý způsob procházení polí i asociativních polí – pomocí nějaké obdoby
foreach
. - Podpora data a času
- Podpora anonymních funkcí
- Možnost serializovat všechny výše zmíněné typy – včetně anonymních funkcí
- Podpora výjimek
- Existuje jen jeden druh prázdné hodnoty –
NULL
. Undefined podporovat nebudeme. - Možnost ukládat hodnoty mimo tělo aktuální funkce – něco jako globální kontext.
Silné typování
Další důležitá otázka: bude jazyk silně, nebo slabě typovaný? Tedy – pokud má funkce dostat parametr určitého typu, co se stane, když dostane jiný? Má se typ automaticky převést, nebo má být vyhozena chyba?
Vzhledem k tomu, že přetypování probíhá v PHP a JS často velmi odlišně, rozhodl jsem se pro silné typování. Slabé typování by sice někdy kód zjednodušilo, ale u programátorů zvyklých jen na jeden z těchto jazyků by mohlo vést k nečekaným a matoucím výsledkům.
Výjimky
A jak se má funkce zachovat, když typ nesouhlasí? Možností je víc – třeba vrátit false
a zalogovat chybu. My ale půjdeme cestou přehlednosti a bezpečnosti: při nesouhlasu typu funkce vyhodí výjimku.
Pole odkazem
Další rozhodnutí se týká předávání polí – bude probíhat hodnotou (jako v PHP), nebo odkazem (jako v JS)? Z důvodu úspory paměti volím: předávání odkazem.
Tabulková pole
Kromě dvou základních typů polí (číselně indexovaná a asociativní) zavádím ještě třetí typ – "tabulková pole". Ta budou mít číselné indexy, ale po vymazání prvku se další prvky neposunou. Místo smazaného prvku vznikne "díra", a původní indexy zůstanou zachovány. Tento přístup se chová podobně jako databázová tabulka s auto-incrementem.
Důvod? Chci, aby bylo možné s těmito poli pracovat jako s databázovými tabulkami. Tj. není nutné přepisovat odkazy na ID záznamů, pokud se některý z nich odstraní.