Osztályok

Ez a rész az osztály típusú csomópontok szintaxisát és felépítését írja le.

Osztály és metódus

Minden metódus csak osztályon belül adható meg, a hatóköre is erre korlátozódik.

Az osztály példányosítását minden metódus megkapja, elérni a @this kulcsszóval lehet.

Virtuális metódusok

Nincs külön szintaxis hozzárendelve, az std:virtual attribútummal lehet megadni.

Statikus metódusok

A statikus metódusok nem támogatottak, mert nagy részben átfedés van a funkcióval. Viszont meg lehet adni funkciót osztályon belül, ekkor kap egy lokális névtér előtagot (az osztály nevét). Viszont a tárolása és a használata elkülönül az osztálytól.

Öröklés

Osztályoknál és a rá épülő típusoknál többszörös öröklés lehetséges, az alaposztályok külön csomópontok. Példányosításkor a közös adatokat tároló elem jön létre, ezek:

  • attribútum

  • virtuális metódusok

  • tároló referencia

  • zárolás

  • referenciaszámláló.

Transzformációnál összeolvadás történik, kivéve az osztály típusokat.

Szintaxis

A tag változó kivételével a deklaráció egy kulcsszóval kezdődik.

Blokk jelölések

Csoportokból három féle található, fő blokk, al blokk, és beágyazott blokk. Osztályoknál nem annyira látványos a különbség, viszont transzformációnál és összetettebb elemeknél sokkal nagyobb az elkülönülés.

Minden nagyobb csoport fő blokkot használ. Kapcsos zárójellel kezdődik { és végződik, de kap még egy extra pontosvesszőt };. így jobban elkülönül a programkód blokk és a csoport blokk. Mivel a szintaxis bővíthető és nagyon sok kulcsszó és jelölés található meg eddig is, a szokatlan elemek határai így könnyebben beazonosíthatóak.

Al blokkok programkódnál és felsorolásoknál használatosak. Kapcsos zárójellel kezdődik { és végződik }.

A beágyazott blokk tartalma nincs feldolgozva a határolók között. Általában más nyelvnél hármas jelekkel jelölik, itt a kapcsos idézőjelek kapnak egy százalék előtagot: %{ és %}.

Példa

*class Class {
    *extends BaseClass;

    Data::String member = %{
        Több soros blokk kulcsszó (*class) értelmezés nélkül.
    %};

    *method method (Data::String value) {
        *if (value == "test") {
            System::stdout("Input: %1\n"[value]);
        }
    };
};

Csomópontok

A nyelv apró építőkövei. Az egységes felépítés megvalósításához szinte minden belőlük épül fel. Tartalmazhatnak nyers adatot, más csomópontokat, lehet nevük, vannak egységes meta metódusaik. Ezek a következők lehetnek:

  • alap adat lekérdezések: @name, @type

  • attribútumok kezelése: @attribAdd(), @attribGet()

  • kapcsolat lekérdezés: @object, @parent, @member(), @isObject

  • listás lekérdezések: @gamListNode(), @gamListString().

Adatként használva minden csomópont tartalmaz saját nevet, attribútumot, azonosítót, raktár hivatkozást, és referencia számlálót. Ekkor minden csomópont egy objektumnak számít. Példányosított összetett típusoknál több csomópont alkot egy objektumot, ekkor közösen osztoznak a felsorolt tulajdonságokon. Tárolás szempontjából nem ideális, de a keresést és a transzformációt nagyban megkönnyíti.

Attribútumok

Minden csomópont tartalmazhat egyedi attribútumot. Előtag és érték opcionális, utóbbi az alábbi lehet:

  • egész (int32)

  • lebegőpontos érték

  • sztring

  • logikai

  • csomópont

    [private std:id="myClass"] *class Class1;

Jelenleg az aritmetikai műveletek kivételek, csak csoportos attribútum adható meg:

    [std:mathMode="saturating"] a = b + c;

Osztály jellegű típusok

Jellemzőjük a többszörös öröklés, virtuális metódusok, véglegesített tagváltozók. Típusai:

  • általános osztály (Group::Class)

  • absztrakt osztály (Group::Representation)

  • projekt (System::Project)

  • beolvasó (System::Parser)

Absztakt osztály

A normál osztály elemein felül tartalmazhat ontológiai definíciókat, transzformációs és kiegészítő adatokat. Átmeneti változat a futásidejű OO osztály és az ontológiai osztály között. Nem példányosítható közvetlenül, csak OO osztállyá alakítva. DSL elemet is tartalmazhat, amit akár futtatható metódussá lehet transzformálni. A nevében megadható egy megkülönböztető «#» karakter, amivel különbséget lehet tenni az absztrakt és a belőle létrehozott végrehajtható osztály között.

    *representation #Thing {
        *metadata std:memberOf #Group;

        Data::String value;

        *method restoreValue ();
    };

Adathalmaz

A Json-hoz hasonló felépítéssel lehet típust adattal feltölteni (átdolgozásra szorul).

    <<{ [attr] Type;
       member1: value1;
       group: {
           member2: value2;
       }
    }>>