Kde sa pravidlá líšia v .rext súboroch
Súbor .rext obsahuje Rea kód napísaný v tej istej gramatike ako súbor .rea, ale platí preň prísnejšia podmnožina. Táto stránka pokrýva iba to, čo sa mení, keď sa Rea parsuje ako rozširujúci modul; pre rozloženie archívu, kľúče manifestu a mechaniku načítavania okolo .rext súborov pozri referenciu enginu formát balíčka .reast a Rozširovanie enginu.
Iba deklarácie
Súbor .rext smie obsahovať len:
- bloky
{function …}…{end function}, - konštanty
{set}na najvyššej úrovni, - importy
{use}, - komentáre.
Akýkoľvek prozaický uzol — odsek, nadpis, skupina volieb, médium, blokový citát, dialóg alebo definícia karty — kdekoľvek v .rext je chyba pri načítaní. Každý .rext v archíve sa skompiluje a overí pri načítaní, ešte pred spustením akejkoľvek prózy, takže pokazené rozšírenie zlyhá pri publikovaní, nie na zariadení čitateľa.
Príkazy riadenia toku ({if}, {return}, …) sú povolené len vnútri tiel funkcií — holý {if} na najvyššej úrovni .rext je v tomto zmysle próza a je odmietnutý rovnako, ako by bol odmietnutý odsek.
{use} je povinné — samotná prítomnosť modul neaktivuje
.rext prítomný v archíve sa skompiluje a overí, ale nie je aktívny, kým ho príbeh nenaviaže {use}. Ide o skutočnú požiadavku za behu, nie o zastaranú dokumentáciu: iba {use} naplní väzby rozšírení interpretera a volanie cez meno, ktoré nikdy neprešlo {use}, sa ticho vyrieši na undefined — loader nevyhlási žiadnu chybu. Väzby sú modulové a netranzitívne: časť, ktorá sama zavolá {use}, automaticky nesprístupní alias inej časti, ktorá chce zavolať to isté rozšírenie — každá časť si {use} volá nezávisle.
{use "extensions/inventory" as inv}
Tvoj batoh váži {inv.total_weight()} kg.Pravidlá, ktoré loader vynucuje nad grafom {use}:
- Iba rozlíšenie v rámci balíčka — cesta
{use}sa rozlišuje vnútri balíčka, nikdy v súborovom systéme, nikdy v sieti. - Graf
{use}musí byť acyklický — cyklus zlyhá pri načítaní a pomenuje daný cyklus. - Duplicitné mená exportov sú chyba, nie „vyhráva prvý".
{use}chýbajúcej cesty zlyhá načítanie, rovnako ako položkamanifest.extensions, ktorá nie je prítomná v archíve.
Konštanta {set} na najvyššej úrovni je súkromná, nie premenná príbehu
Vnútri .rext deklaruje {set} na najvyššej úrovni modulu súkromnú konštantu. Jeho funkcie ju vedia čítať, ale nikdy sa nestane premennou príbehu: nikdy sa neobjaví v exportovanom stave čítania, dva moduly môžu deklarovať rovnaké meno konštanty bez kolízie a modul nikdy nemôže prepísať premennú, ktorú autor deklaroval inde. Parameter funkcie s rovnakým menom konštantu zatieni.
{set} vnútri tela funkcie sa riadi bežným rozsahom platnosti Rea funkcií a zapisuje premennú príbehu presne tak, ako by to urobil v súbore .rea — stav cyklu preto akumulujte rekurziou, nie počítadlom, ktoré unikne do uloženého stavu čitateľa.
Funkcie príbehu (.rea) zostávajú súkromné
Súbor .rea môže naďalej deklarovať {function}, ale tie sú súkromné a platné len v danom dokumente — exportujú iba funkcie z .rext. Ak chcete zdieľať funkciu naprieč časťami, presuňte ju do .rext a naviažte ju {use} z každej časti, ktorá ju potrebuje.