A BETA programozási nyelv

A fragment-rendszer



A fragment-rendszer

Minden BETA program használja a Fragment rendszert. Egy fragment egy BETA program darabjaként értelmezhető, vagyis egy modulnak. A fragmentek fájlokba vannak szervezve. Egy fájl akár több fragmentet is tartalmazhat. Az alap BETA környezet - a betaenv - az alapvető BETA típusokat biztosítja, mint például az integer, char, boolean és a text. Azért, hogy használni tudjuk ezeket a típusokat, a programban jelezni kell, hogy a betaenv környezetre szükség van. Erre az Origin kifejezés használható:

Origin '~beta/basiclib/v1.5/betaenv' --- program: descriptor --- (# do 'Hello world!' -> putline; #)

A példa két új részt tartalmaz: az Origin specifikációt és a programleírót (descriptor). Az Origin specifikáció azt mutatja, hogy a betaenv fragmentet használjuk. A programleíró pedig azt jelzi, hogy a következő rész egy BETA descriptor lesz, vagyis egy minta, aminek a neve az, hogy program. E név alapján építi be a mintát a megfelelő helyre a betaenv környezetbe a rendszer. A betaenv környezet így néz ki:

(# put: (# c: @char; enter c do ... #); putline: (# t: ^text; enter t[] do ... #); ... ... <<SLOT LIB: Attributes>> ... do (* a végrehajtás inicializálása *) ... <<SLOT program: descriptor>> ... (* végrehajtás befejezése*) #)

Tehát a betaenv környezet egy egyszerű minta, ami két lyukat (slotot) tartalmaz. Az egyiknek a neve program, és descriptor típusú, a másikat LIB-nek hívják, és Attributes típusú. A program-slot üres, és kitölthető egy BETA programmal, ha egy mintát így definiálunk:

--- program: descriptor --- (# ... #)

Minden BETA programban pontosan egy ilyen szerkezet szerepelhet. Egy slot kitöltése szövegmásoláshoz hasonlítható, de a láthatósági viszonyok is szerepet játszanak.

A Helloworld program kitölti a program-slotot a betaenv mintában, és az alábbi kibővített BETA programot adja eredményül:

(# put: (# c: @char; enter c do ... #); putline: (# t: ^text; enter t[] do ... #); ... ... <<SLOT LIB: Attributes>> ... do (* a végrehajtás inicializációja *) ... (# do 'Hello World!' -> putline; #) ... (* végrehajtás befejezése*) #)

A LIB-slot könyvtárak definiálására használható, amiket más BETA programok felhasználhatnak. Ha például egy új művelettel szeretnénk kiegészíteni az alapkörnyezetet, aminek a neve putBoxed, az alábbi módon tehetjük meg:

ORIGIN '~beta/basiclib/v1.5/betaenv' ---LIB: Attributes--- putBoxed: (# t: ^Text; enter t[] do '['->put; t[]->puttext; ']'->put; #);

Ez egy fragment, ami jelen esetben a putBoxed.bet fájlban szerepel. Ez után a HelloWorld programban includolni kell a putBoxed könyvtárt.

ORIGIN '~beta/basiclib/v1.5/betaenv' INCLUDE 'putBoxed' --- program: descriptor --- (# do 'Hello World!'->putBoxed; #)

A betaenv mintában tehát már a LIB-slotot is kitöltöttük. A programot egyszerűsíthetjük az alábbi módon:

ORIGIN 'putBoxed' ---program: descriptor--- (# do 'Hello World!'->putBoxed; #)

Ez azért működik, mert már a putBoxed.bet fájlban specifikálva van a betaenv környezet.

A ---LIB: Attributes--- sor többször is szerepelhet, akár különböző fájlokban is. Ezek segítségével könyvtárakat úgy hozhatunk létre BETA-ban, hogy a LIB nevű fragmentben helyezünk el minta-deklarációkat. Aztán a fájlt includolva a deklarációt felhasználhatjuk a programunkban. Természetesen mi is definiálhatunk slotokat a programunkban, és így igen komplex rendszer kiépítésének a lehetőségét biztosítja a BETA rendszer.

Interfész és implementáció

A fragment-rendszer segítségével különválaszthatjuk az interfészt az implementációtól. Az előbbi példában a putBoxed művelet implementációját az interfésszel együtt includoltuk be a Helloworld programba. A putBoxed implementációját egy másik fájlba helyezhetjük, a dopart nevű slot használatával.

putBoxed: (# t: ^Text; enter t[] <<SLOT putBoxed: dopart>> #);

Megadtuk a művelet interfészét, látható, hogy egy text paramétere van. Az implementáció rejtve van. Az implementáció a dopart fragmentben van részletezve:

--- putBoxed: dopart --- do '['->put; t[]->puttext; ']'->put;

Már csak annyit kell biztosítani, hogy ezt a kettőt a rendszer képes legyen összeilleszteni. Abban a fájlban, amelyikben az interfész található, meg kell mondani, hogy melyik fájlban található az implementáció. Ez a BODY kulcsszóval (a fragment rendszer kulcsszava) tehető meg.

ORIGIN '~beta/basiclib/v1.5/betaenv' BODY 'putBoxedBody' --- LIB: Attributes --- putBoxed: (# t: ^Text; enter t[] <<SLOT putBoxed: dopart>> #);

És a másik oldalról, abban a fájlban, amelyikben az implementáció van, meg kell mondani, hogy melyik interfészhez tartozik. Erre az ORIGIN kulcsszó használható:

ORIGIN 'putBoxed' --- putBoxed: dopart--- do '['->put; t[]->puttext; ']'->put;

Az implementáció és az interfész elválasztásának nagy előnye, hogy így külön fordítható egységeket kapunk. Az implementáció megváltozása esetén nem kell újrafordítani sem az interfészt, sem más olyan programot, ami felhasználja azt. Az ORIGIN, INCLUDE, BODY, descriptor, attributes, dopart kulcsszavak nem a BETA nyelv alapszavai, hanem a BETA fragment-rendszer szavai. Tehát a fragment-rendszerrel szétdarabolhatjuk a programunkat, bizonyos típusú részekre - descriptor, attributes, dopart. A darabolást úgy jelöljük, hogy slotokat definiálunk a mintában, és ezeket a slotokat később kitöltjük. A végleges minta tehát már előre adott (ez általában a betaenv környezet), a programunkat ebbe helyezzük bele. A fragment-rendszer technikája a C előfeldolgozójától annyiban tér el, hogy itt az egyes slotoknak 'típusa' van, vagyis nemcsak egyszerű szövegmásolás történik, hanem szemantikus vizsgálat is. A lyuk típusa úgy értendő, hogy az attributes slotban tényleg csak attribútumok, a dopart slotban pedig csak utasítások szerepelhetnek, objektumdeklarációk csak descriptor slotban lehetnek.

Alapkönyvtárak