A Genie programozási nyelv

Típusok, típuskonstrukciók

Típusszerkezet

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

var i : int = 42
helyett elegendő ezt írni:
var i = 42

É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

Elemi típusok Genie-ben:

Diszkrét típus(ok)

enum Jegy Elegtelen = 1 Megfelelt = 3 JolMegfelelt = 5 init print "%s", Jegy.Elegtelen

Valós típus(ok)

Referencia típus(ok)

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ó.

/* allows null to be passed as param and allows null to be returned */ def fn_allow_nulls (param : string?) : string? return param /* attempting to pass null as param will lead to that function aborting. Likewise it may not return a null value */ def fn_no_null (param : string) : string return param

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.

Mutató típusok

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.

o : object* = new Object

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!

o->function_1 o->data_1 delete o;

Típuskonstrukciók

Kidolgozásra vár...

Tömb típus(ok)

A tömb beépített típus:

hills : array of int = {1,2,3}
Egy tömb mérete hills.length módon lekérdezhető, ellenben ez konstrukció után meg nem változtatható.

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:

int x = 6, y = 7; string s = @"$x * $y = $(x * y)";

Direkt szorzat típus

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.

class Pont x : double y : double init var p1 = Pont() var p2 = Pont() x = 1.0 y = 2.0

Unió típus

A Genie nyelv nem támogat unió típust.

Halmaz típus

A halmaz típust a LibGee könyvtár bocsátja rendelkezésre a Set osztály formájában.

Típuskonverziók

A Genie nyelv nem támogat típuskonverziókat.

Változók, konstansok

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.

var s = "hello" t : string = "world"

Konstansok lehetnek a tömbök.

const int_array : array of int = {1, 2, 3}

Kifejezések, operátorok

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.

/* értékadás */ a = 2 /* aritmetikai kifejezése */ a = 2+2 // 4 a = 2-2 // 0 a = 2/2 // 1 a = 2*2 // 4 a = 2%2 // 0 a++ // a = a + 1 a-- // a = a - 1 a += 2 // a = a + 2 a -= 2 a /= 2 a *= 2 a %= 2 /* relációk */ a > b a < b a >= b a <= b a is not b a is b /* logikai kifejezések */ a and b a or b not (b) if (a > 2) and (b < 2) print "a is greater than 2 and b is less than 2" /* bit operatorok (C szintax) */ |, ^, &, ~, |=, &=, ^= /* bit shifting */ <<=, >>= /* Object related */ obj isa Class