A gap nem típusos nyelv, egy változó típusát nem lehet megadni.
Az gap tetszőleges hosszú egész számot tud kezelni, a hosszának csak a mem óriánk szab határt. Például:
Fontos, hogy habár a nyelv egyáltalán nem támogat lebegőpontos szá- mokat, egész számok kifejezéseként nyilván minden racionális számot leírhatunk. Emiatt nincsenek számábrázolási hibák, a gap minden racionális számot egzaktul tárol. Azonban ennél bonyolultabb kifejezések is léteznek.
A gap E(n) alakban tudja tárolni az n-ik primitív egységgyököt, így ezek
hatványainak racionális együtthatós lineáris kombinációit is képes kezelni.
Ezek a racionális test ún. ciklotomikus bővítései. Ez nem fedi le az összes
algebrai számot, hanem csak részét. Ezek közé tartozik pl. a
21/2 = E(8) − E(8)3 = Z8 − Z38 , ugyanis:
(Z8 − Z38)2=Z28 + Z68 - 2Z48 = Z4 - Z4-2(-1)=2
Pédák:
Láthatjuk tehát, hogy a gap nem csak racionális, de bizonyos típusú komplex számokat is kezel (ugyanis i = E(8)) egzaktul.
A nyelv elsősorban csoportelméleti algoritmusok megírására készült. Egy csoportot legegyszerűbben úgy tudunk kezelni, ha keresünk egy vele izomorf permutációcsoportot.
Egy halmaz bijektív leképezéseit önmagára a csoport permutációinak nevezzük. A gap az egész számok permutációit képes kezelni, ezek jelölését pár példán keresztül mutatjuk be:
Egy halmaz permutációinak szorzatán a permutációk, mint függvények
kompozícióját értjük, a permutáció hatása egy elemen az a szám, amelyet a
függvény rendel hozzá, ezt a gap ^ operátora jelzi.
Példák:
A karakterket aposztrófok közé kell tenni. Például: 'a'
A példa magáért beszél:
A gap listáinak különböző typusú elemei is lehetnek:
Vagy tartalmazhatja önmagát (amit a ~ szimbólum jelöl):
De hagyhatunk lyukakat a listában:
Listát megadhatunk intervallumként is az első és utolsó elemével [1..100],
vagy (ha nem egyesével növekszik) az első, a második, és az utolsó elemével
[0,5..100].
A gap a sztringeket a karakterek listájaként értelmezi.
Hiba jelzésére a User könyvtár (statikus osztály) Leave metódusa szolgál. Azokat a föggvényeket, amelyek a User::Leave metódust hívják leave-elő függvényeknek nevezzük. A User::Leave hívás logikailag megfelel a C++-ban megszokott throw-nak, mely az adott típusú kivételt dobja. Symbian-ban a kivétel típusa egy számot (hibakódot) jelent.
Megkülönböztetjük két objektum egyenlőségét (equality), és azonosságát (identity), Két objektum akkor azonos, ha fizikailag ugyanott helyezkednek el a memóriában, akkor egyenlő, ha az = metódus igaz (a metódusokról ké- sőbb). Ezzel megkülönböztetjük az objektum, és az elem kifejezéseket, ahol az elem az objektumok kategóriájának az ekvivalenciaosztályait jelenti.
Két nem identikus objektum akkor lehet egyenló egymással, ha:
1. Az egyik a másik másolalata.
2. Ugyanazt az értéket msáképp tárolja.
3. egy matematikai ekvivalenciareláció miatt a két objektum ekvivalens.
Egy objektum lehet vátoztatható (mutable), vagy nem (immutable), illetve lehet másolható, vagy nem. Az ezzel kacsolatos függvények:
IsMutable(obj)Megmondja, hogy az objektum változtatható-e.A GAP típuskonstrukciója a megfelelő matematikai fogalmakra épít, teh át itt nem osztályokról, hanem kategóriákról beszélünk. Öröklődés valamilyen értelemben van, de nem hasonlítható az objektumorientált nyelvekben lévőhöz. A GAP-es terminológia mindent objektumnak nevez, hiszen minden az objektumok kategóriájába tartozik.
Minden objektumnak van típusa, minden típus objektum, ami tartalmazza az objektum családját (family), és a szűrőit (filters). Egy típus családja a FamilyOfTypes. Természetesen minden család is objektum, és ezek családja a FamilyOfFamilies. A családnak azt kell teljesítenie, hogy ha két objektum egyenlő, egy családba kell tartozniuk.
A szűrők logikai függvények, azaz egy adott objektumhoz rendelnek igaz, vagy hamis értéket. Minden szűrőnek van egy rangja, amely egy szám (ez később a műveleteknél még fontos lesz).
A szűrőkön értelmezett a logikai és művelet, pl: IsMutable and IsCopyable. Egy ilyen szűrő rangja az implikált szűrők rangjának összege. Az egyszerű szűrők azon, amelyek nem implikálnak más szűrőt. Ezek a szűrők ismertek minden objektumra, és az értékeit az objektum egy bitlistában tárolja. A rangjuk mindig 1.
Speciális szűrők:
1. A kategóriák (Category) olyan szűrők, amelyek meghatározzák, hogy
mely műveletek megengedettek az objektumon, de ez nem jelenti azt,
hogy a művelet sikeres is lesz. Példa: Legyen m egy mátrix. A *
operátor értelmes, mert a mátrix benne van az IsMultiplicativeElement
kategóriában. Az Inverse művelet is értelmes, hiszen benne van
az IsMultiplicativeElementWithInverse kategóriában, ennek ellenére a
m nem feltétlen invertálható. Ekkor az Inverse metódus hibát jelez.
Hasonlóképpen az 1/0 kifejezés is hibát okoz annak ellenére, hogy az
osztás értelmezett az egész számokon (IsInt).
2. A reprezentáció (representation) olyan szűrő, amely az objektum konkr
ét tárolását adja meg. A nyelvben létező reprezentációk:
IsInternalRepBelső reprezentáció, ezeket tekintettük az alaptípusoknak.
IsDataObjectRepOlyan objektum, amely reprezentációját nem a
GAPben definiálták, hanem a GAP kernel része, így a belső strukt
úrája nem elérhető.
IsComponentObjectRep, IsPositionalObjectRepEzek a GAPben
létrehozott reprezentációk. Ezekből tudunk saját reprezentá-
ciót készíteni, (amelyekből még sajátokat) azzal a feltétellel, hogy
csak egyszeres öröklődés létezik.
3.Az Attribútumok tulajdonképpen egyrészt műveletek, másrészt szűrők.
Ha a művelet végeredménye ismert, akkor lesz a szűrő igaz. Ilyen
attribútum egy csoport mérete:
A tulajdonságok olyan speciális attribútumok, amelyek értéke igaz,
vagy hamis. Ez egyrészt önmaga egy szűrő, másrészt egy szűrő az is,
hogy ismerjük-e az értékét.
Pl. ha egy absztrakt kétműveletes halmazt kezelünk, ilyen tulajdons
ág az IsAssociative, IsCommutative, IsAntiCommutative, IsLDistributive,
IsRDistributive. Ezeket a GAP használni fogja a műveletek
kiértékelésekor, miután ismertek.