A GAP programozási nyelv

Alprogramok

Alprogramok

function( [ arg-ident {, arg-ident} ] ) [local loc-ident {, loc-ident} ; ] statements end

Szintaktikailag nem különülnek el az eljárások és a függvények. (Nincs procedure kulcsszó.) Az eljárás olyan függvény, amely nem ad vissza értéket. De azért az esetek túlnyomó részében ha egy alprogram értéket ad vissza, akkor nincs mellékhatása. A GAP-es terminológia ezeket függvényeknek hívja, és megkülönbözteti a műveletektől, és a metódusoktól.

A függévny törzse lehet üres is.

gap> alma:=function() > end; function( ) ... end gap> alma(); gap>

Műveletek

A műveletek (operation) olyan függvények (egészen pontosan az IsOperation kategóriába tartoznak, ami az IsFunction része), amelyet függvények alkotnak, amelyeket a művelet metódusainak nevezünk, és a ugyanazt számolják ki, de másképp. A művelet az argumentumokban megadott objektumok szűrői alapján kiválaszja az egyik metódusát, és azt hívja meg.

Példa: Az Attrimbútumok műveletek, és mindnek van egy speciális met ódusa, ami visszatér a már kiszámolt értékkel, ha az attributumhoz tartozó szűrő igaz, azaz, az attribútum már ki van számolva.

Kapcsolódó függvények:
NewOperation(name,args-filts) A name néven hoz létre új műveletet, ahol az arg-filts egy szűrőkből álló tömb.

InstallMethod(name[,info [,famp],arg-filts[,val],function)] A name művelethez hoz létre új metódust a function függvényből, ahol az arg-filts egy olyan szűrőkből álló tömb, amelyek implikálják a művelet szűrő- it, info a rövid leírás (ha nincs megadva: üres sztring), val egy szám (ha nincs megadva 0), a metódus prioritása, famp pedig egy logikai függvény (ReturnTrue).

Egy metódus akkor alkalmazható egy argumentumra, ha:
1. az argumentumok száma megegyezik az arg-filts tömb méretével.
2. minden argumentumra a hozzá tartozó arg-filts igaz
3. az argumentumok családjaival, mint argumentumokkal meghívott függvny igazzal tér vissza.

Végül a művelet meghívásakor az az alkalmazható metódus fut le, amely rangja a legmagasabb. Egy metódus rangja a szűrői rangjainak az összege, plussz a prioritása. A meghívott metódus végül dönthet úgy, hogy nem tud lefutni (TryNextMethod()), ekkor sorban a második jön (amennyiben az első nem változtatta meg az objektumot, mert ilyenkor lehet, hogy a szűrői is megváltoznak, és előlről kezdődik a verseny). Amennyiben egyetlen metódus sem alkalmazható, a művelet hibával tér vissza.

Ha az arg-filts tartalmaz tulajdonságot, és nincs alkamazható metódus, arra az esetre lehet definiálni redispatcheket. Ez annyit jelent, hogy egy meghat ározott filterre kiszámol egy adott argumentumot, amivel a műveletnek már lesz olyan metódusa, ami alkalmazhatóvá válik.

Lehet definiálni immediate műveleteket. Ezek olyan műveletek, amelyek nagyon alacsony költségűek (GAP terminológia: zero cost method), és azonnal meghívódnak, amikor alkalmazhatóvá vállnak. Egy extrém példa: a triviális csoportok szűrője: IsTrivial, tehát az IsTrivial szűrő akkor igaz, ha a csoportnak csak egy egységeleme van. A csoportoknak létezik Size Attribútuma, erre lehet írni olyan metódust, amely ezt egyre állítja, és az arg-filtersben szerepel az IsTrivial. Ezt célszerű immediate metódusnak be- állítani.