A Stratego termátíró rendszer

Alprogramok, modulok

Modulok

A Stratego számára egy forrásfájl egy fordítási egység; ezeket modulnak nevezzük. A modul általános szerkezete (e blokkokat egymás után írjuk, azokat speciális jellel nem zárjuk le):

Ezek közül a fejlécet kivéve bármelyik elhagyható. Ha egy modult nem csak függvénykönyvtárként, hanem programként szeretnénk használni, minimálisan egy stratégiát meg kell adni, melynek konvenció szerint main a neve. Ez a stratégia fog a bemenő adatokra lefutni.

Felhasználói stratégiák

Felhasználói stratégiát a modul strategies blokkjában definiálunk, azokat újsorral választjuk el. A paraméter nélküli stratégia-definíció általános formája: stratégianév = stratégia.

Például egy programnak lehet a fő stratégiája az Eval szabály alkalmazása. Ekkor a modul formája:

module eval-p rules Eval : Not(True()) -> False() [...] strategies main = Eval
Paraméterátadás

A stratégiák paraméterekkel is rendelkezhetnek. Kétféle paramétert különböztetünk meg:

A stratégia formális paraméterlistájában először a stratégiaparamétereket soroljuk fel, majd egy | jel után a termparamétereket. Ha nincsenek termparaméterek, a | jel elhagyható. Például a standard könyvtárban található try stratégiát, ami megkísérel alkalmazni egy stratégiát, de sikertelenség esetén az aktív termet változatlanul hagyja, a következőképp definiáljuk:

try(s) = s <+ id
Rekurzió

A Stratego lehetőséget ad rekurzív stratégiák definiálására. A régebb óta támogatott mód a fixpontkombinátoros forma. A rec operátor első paramétére egy változónév, második paramétere egy kifejezés. A kifejezést úgy értékeli ki, hogy a változónév helyére rekurzívan behelyettesíti önmagát. Például a standard könyvtárbeli repeat(s) stratégiát, ami egy s stratégiát mindaddig alkalmaz, míg a kapott termre s alkalmazható, a következőképp definiálhatjuk:

repeat(s) = rec x ( (s; x) <+ id )

Az újabb verziókban már az egyszerűbb jelölés is megengedett, a stratégiára név szerint is hivatkozhatunk:

repeat(s) = (s; repeat(s)) <+ id