A GAP programozási nyelv

Vezérlési szerkezetek

Main loop és break loop

Main loop

A vezérlés normális esetben az un. "main (read-eval-print) loop"-ban van. Ez azt jelenti, hogy először begépeljük az inputot, a GAP kiértékeli, majd kiírja az eredményt.

A folyamat pontosan az alábbi módon történik: Annak jelzésére, hogy a GAP kész fogadni a bemenetet megjelenik a gap> prompt. Utasításaink vé- gén mindenképpen be kell írnunk, hogy return. (Ez kiváltható az enter (vagy az ennek megfelelő) billentyű lenyomásával.) Ez azért szükséges, mert a GAP addig nem csinál semmit, így szabadon szerkeszthetjük a bemenetet. Egy sorba tobb utasitást is írhatunk. (Persze mindegyiket pontosvesszővel lezárva.)

Teljesen elfogadható, ha egy utasitást tobb sorba írunk. Miután beírtuk az utasítás elejét, es enter-t ütöttünk, ha az utasítás nem teljes, a GAP a részleges promtot mutatja (>). Ha ilyet látunk, tudhatjuk, hogy a GAP vár az utasítás további részére. Ez történik akkor is, ha elfelejtjük a pontos vesszőt. Viszont megjegyzendő, hogy a return előtti rész kiértékelődik független ül attol, hogy befejeztük az utasítást, vagy sem.

Ez után szintaktikai ellenorzés történik. Ha ez rendben találtatik, megtört énik a kiértékeles, vagy a vegrehajtás. Ha nem látjuk a promptot, az azért van, mert a GAP még mindig az előző inputon dolgozik.Ha végzett kiírja az eredményt, ha van ilyen. Ha nem szeretnénk latni, akkor az utasítás végére dupla pontosvesszőt kell írnunk.

Egy utasítás során mindig elerhető az előző olyan utasítás eredménye, amelynek volt ilyen a last változóban. Az az előtti a last2-ben van, és így tovább.

gap> 1; 2; 3; 1 2 3 gap> last3 + last2 * last; 7

Hasonlóan az előzőekhez tárolja az utolsó utasítás óta eltelt időt a time változó.

Break loop

Ha valamilyen hiba adódik, vagy megszakítjuk a futást (jellemzően Ctrl+c- vel), akkor lép a GAP az un. break loop-ba. A break loop a legtöbb tekintetben hasonlít a main loopra, azaz beírhatunk utasításokat, a GAP beolvassa, kiértékeli őket, majd megmutatja az eredményt, ha van. Ezek a kiértékelések abban a környezetben történnek, amelyben a hiba történt. így átnézhetjük a hiba történtekor aktív függvények argumentumait, lokális változóit, sőt meg is változtathatjuk azokat. A prompt megváltozik brk>-re, jelezve, hol is vagyunk.

gap> 1/0;
Rational operations: must not be zero not in any function Entering break read-eval-print loop ... you can 'quit;' to quit to outer loop, or you can replace via 'return ;' to continue

Ha hiba történik a break loopban, akkor ismét egy break loop-ba lépünk, csak mélyebb szinten.

brk> 1/0;
Rational operations: must not be zero not in any function Entering break read-eval-print loop ... you can 'quit;' to quit to outer loop, or you can replace via 'return ;' to continue brk_02>

Kétfélekeppen tudjuk elhagyni a break loopot.

Az első, hogy kilépunk. Ez a quit paranccsal, vagy az eof karakterrel (rendszerint Ctrl+d) történik. Ebben az esetben a vezérlés átadódik az egyel magasabb szintű break loopnak, vagy ha nincs ilyen, a main loop-nak.

A másik mód a visszatérés. Ezt a return;, vagy a return expr; paranccsal érhetjük el. Ha szándekosan vagyunk a break loop-ban, visszatérhet ünk return;-nel. Ha valamilyen hiba miatt, akkor lehet, hogy még előbb meg kell változtatnunk néhány változó értéket, vagy esetleg valamilyen értékkel kell visszatérnünk. Hogy adott esetben a lehetőségek közül melyek állnak rendelkezésünkre, arról tájékoztatást kapunk közvetlenül az után, hogy bel éptünk a break loopba.

Hozzaférés a változókhoz

Hozzáférhetünk az adott, és a magasabb szinten lévő változókhoz is. De ha ugyanazt a változónevet használjuk, az alacsonyabb szintű objektum elfedi a magasabb szinten levőt.

Ha ezeket szeretnénk elérni, használhatjuk a DownEnv( [nr] ) illetve a UpEnv( [nr] ) függvényeket. A DownEnv( [nr] ) az argumentumban megadott lépésnyivel feljebb lép a környezetben. A visszalépéshez negatív számot kell megadnunk. Az UpEnv( [nr] ) éppen ennek ellenkezőjét csinálja. (Kicsit zavaró, hogy a nevük éppen fordítva van, ez értelmezés kérdése. (Talán célszerű lenne "ki" és "be" haladni.) Mindenesetre talán a legjobb megoldás, ha csak az egyiket használjuk, így nem tudjuk összekeverni.) Fontos, hogy ezek a függv ények csak arra szolgálnak, hogy elérjuk az adatainkat minden szinten, és ha visszatérünk, akkor automatikusan a megfelelő szintre ugrik a vezérlés.

Kilépés

Általános esetben kilépni a quit paranccsal, vagy az eof karakterrrel (Ctrl+d) tudunk. Vészhelyzetben ugyanerre a QUIT szolgál bármely gap>, brk> vagy brk_nn> promptnál.

A tulajdonképpeni kilépés előtt mindig meghivódnak azok a függvények, amelyeket előzőleg beállítottunk az InstallAtExit> használatával.

gap> InstallAtExit(function() Print("bye\n"); end); gap> quit; bye

Értékadás

A nyelv nem támogatja a többszörös értékadást, és az értékadás nem kifejezésnek számít.

var:=expr

Elágazás

Első típus: nincs csellengő else.

if bool-expr1 then statements1 { elif bool-expr2 then statements2 } [ else statements3 ] fi;

Második típus: A kifejezésben a stats2 ág a második ifhez tartozik.

ˆ if expr1 then if expr2 then stats1 else stats2 fi; fi;

A második típusú kifejezéssel ekvivalens a következő.

ˆ ˆ if expr1 then if expr2 then stats1 fi; else stats2 fi;

Ciklus

While while bool-expr do statements od;
Repeat repeat statements until bool-expr
For for simple-var in list-expr do statement od;

While

ˆgap> i := 0;; s := 0;; gap> while s <= 200 do > i := i + 1; s := s + i^2; > od; gap> s; 204

Repeat

ˆgap> i := 0;; s := 0;; gap> repeat > i := i + 1; s := s + i^2; > until s > 200; gap> s; 204

For

ˆgap> s := 0;; gap> for i in [1..100] do > s := s + i; > od; gap> s; 204

A különbség a while és a repeat ciklus között, hogy a másodiknál legal ább egyszer lefut a ciklusmag.

A Break és a Continue utasítások csak cikluson belül használhatóak.
Break: azonnal kilépünk a legbelsőciklusból
Continue: az aktuális iteráció további részét nem hajtjuk végre

Szekvencia, üres utasítás, GOTO

GOTO nincs.

Nincs explicit blokk utasítás. A ; terminator. Konkrét üres utasítás sincs, viszont a ciklusmag lehet üres.