A Genie a C# programozási nyelvhez hasonlóan két típussal rendelkezik: referencia típusokkal és értéktípusokkal (angol szakirodalmakban: reference type, value type). Működésük is hasonló: az értéktípusok átadáskor másolódnak, míg a referencia típusok esetében csak egy referencia adódik át ugyanarra az objektumra. Ilyen átadáskor a Genie figyeli a még élő referenciák számát, így segíti a memória kezelését. Ha a saját osztályunkat a Glib Object-ből származtatjuk, akkor a saját típusunkra is ügyelni fog.
Referencia típus minden, amit osztályként deklarálunk, attól függetlenül, hogy származtatjuk-e a Glib Object osztályából. A tömbök és a string típusú objektumok is referencia típusok!
Különlegesség a nyelvben, hogy típuskikövetkeztetéssel rendelkezik a lokális változóira. Ez azt jelenti, hogy lokális változókat deklarálhatunk a var kulcsszóval a típusuk feltüntetése nélkül, melyet a rendszer egyértelműen levezet automatikusan a rendelkezésre álló programszövegből. Tehát
Érték szerinti szemantikával rendelkeznek az elemi típusok és a struct.
Referencia szemantikával rendelkezik az osztály, a string és a tömb.
Elemi típusok Genie-ben:
Egy referencia típust megjelölhetünk úgynevezett nullable tulajdonsággal ("?" karakter), mely lehetővé teszi null érték tárolását a hozzá tartozó változóban. Nem-nullable változóba null érték kerülése futásidejű hiba kiváltását okozza.
Gyenge referenciáknak a referenciaszámláló memóriamodell miatt van jelentőségük.
Ha egy objektumra nem mutat referencia, vagy csak gyenge referencia mutat rá, akkor azt a rendszer felszabadíthatja.
Egy referencia tulajdonjogát a kettőskereszt jellel ("#") adhatjuk át, ekkor az eddigi tulaj lemond a birtoklásról, azaz gyenge referenciává válik, míg az értékadáskori célváltozó pedig birtoklóvá lép elő.
Szemantikailag két fajtáját különböztetjük meg:
"delegate" típusú változóban függvény/eljárás referencia tárolható.
A nullable módosító függvények paraméterének és visszatérési értékének is adható.
Ezen ellenőrzések futásidőben történnek. Az ellenőrzések kikapcsolhatóak mikor a kódot végig hibakövetik, erről bővebben a valac dokumentációban olvashatunk.
Alapesetben – ahogy ezt a korábbiakban láthattuk – a Genie foglalkozik a memóriakezeléssel, ezt viszont elkerülhetjük (még ha nem is ajánlott) pointerek használatával. Minden egyes pointerrel létrehozott objektumért – és ezáltal a felszabadításukért is – a programozó felel.
Figyeljük meg, hogy a szintaxis hasonló a C alapú nyelvekéhez és nem csak a létrehozáskor, hanem az objektum interfészéhez való hozzáféréskor továbbá a felszabadításkor is!
Kidolgozásra vár...
A tömb beépített típus:
A beépített 'string' egy speciális immutabilis tömb típus.
Egy alfaja a 'verbatim' szöveg, mely hármas idézőjelekkel van körbevéve, és benne nem értékelődnek ki a vezérlőjelek és idézőjelek.
További variánsa a sablon szöveg, mely '@' jellel kezdődik.
Ennek kiértékelésekor a benne található, '$' jelekkel prefixált változók és kifejezések kiértékelődnek.
Az alábbi példa lefutás végén az 's' változóba a "6 * 7 = 42" szöveg kerül:
A 'struct' kulcsszóval hozható létre. Primitív típusként a vermen tárolódik. Szemntikája mélymásoló. Az osztályoknál jóval szerényebb típus: nem támogat öröklést, szignálokat, interfészek megvalósítását.
A Genie nyelv nem támogat unió típust.
A halmaz típust a LibGee könyvtár bocsátja rendelkezésre a Set osztály formájában.
A Genie nyelv nem támogat típuskonverziókat.
A Genie statikus típusozású, tehát minden változónak meg kell adni a típusát deklarációkor. Az már más kérdés, hogy a C#-hoz hasonlóan itt is van var típus (használatát már korábban leírtuk). A szintaxist a deklarációkhoz a következő példában láthatjuk.
Konstansok lehetnek a tömbök.
Az operátorokat a következő példakódban láthatjuk. A C alapú nyelveket ismerőknek nem okoz majd különösebb nehézséget az elsajátításuk.