A BETA-ban statikus és dinamikus referenciákat deklarálhatunk - mindkettőt kizárólag a minták deklarációs részeiben. A statikus referencia a program futása alatt rögzített módon kapcsolódik egyetlen objektumhoz, a dinamikus referencia viszont futási időben más-más objektumhoz is kapcsolható. Ebből az is látszik hogy a BETA-ban minden referencia, de a referencia nevének leírásával nem a pointerre, hanem az általa mutatott memóriaterületre hivatkozunk. A pointert speciálisan kell jelölni, mint már láttuk a jelöléseknél.
i: @integer; | statikus referenciát jelöl |
i : ^integerObject; | dinamikus referenciát jelöl |
Megjegyzés: Az alapmintáknak megfelelő típusú változók csak statikus referenciájúnak deklarálhatók, dinamikus referenciát a velük rokon Object végződésű predefinit mintákra (pl. integerObject, charObject, realObject stb.) alkalmazhatunk.
A deklarált változók mindig a deklarációjukat tartalmazó mintában, illetve az adott mintában deklarált mintákban láthatóak közvetlenül, ilyen szempontból a minta hagyományos értelemben vett blokként működik. A mintán belül deklarált értékekre kívülről csak a tagkiválasztó operátorral lehet hivatkozni: objektum_neve.tag_neve.
A minta hívása úgy történik, hogy a minta híváskor lemásolódik, megkapja az input változókat, valamint egy listán azokat a változókat, melyek láthatósági köre kiterjed rá.
A megfeleltetés jele a ->. A megfeleltetésekből tetszőleges hosszú láncot lehet fűzni. Ez használható a hagyományos értelemben vett értékadás helyett, valamint a paraméterek átadására, illetve átvételére is. Ha meggondoljuk, ez jogos, hiszen az értékadást a minta meghívásával hajtjuk végre, tehát valójában az értékadás a minta futtatása. Ennek megfelelően, ellentétben a megszokottal, az értékadás balról jobbra történik. A megfeleltetés általános példája:
Ilyenkor a függvény átveszi az x, y paramétereket, lefut, majd a visszatérési értékeit a v, w változókba tölti. Azt gondolhatnánk, hogy így szimultán értékadás is írható a függvény elhagyásával, de ez nem az, mert valójában megfelel két értékadás szekvenciájának, így például az (x, y)-> (y, x) értékadás esetén x és y értéke is x lesz.
Példa: Helloworld
Amennyiben pointer típusú változónak akarunk értéket adni vagy helyet foglalni, akkor ezt a következő módon tehetjük meg:
Példa: Referenciák
A megszokott vezérlési szerkezeteket kontrollstruktúrák segítségével valósították meg. A vezérlési szerkezeteknél a # jel helyett a vezérlőszerkezet neve áll, például: (if ... if).
A feltételes utasítás általános alakja:
A kifejezés lehet logikai, egész vagy valós értékű; mivel a karakter értékek egész értékeknek felelnek meg, ezek is használhatók. (A valós értékű kifejezések egyenlőség-vizsgálata okozhat meglepetéseket a számábrázolás módja miatt.) Az if utasítás összehasonlítja a kifejezés értékét az egyes eseteknek megfelelő - a // jelek és a then kulcsszó közti - értékekkel. Ha egyik egyenlőségvizsgálat sem teljesül, akkor az else ág hajtódik végre. Ha több összehasonlítás is telejül, akkor ezek közül véletlenszerűen választ egyet, és azt az ágat futtatja le.
Sok más nyelvektől eltérően az egyes ágaknak megfelelő érték nem csak konstans, illetve azok listája lehet (mint például C/C++-ban a switch/case, illetve Adában a case/when esetén).
A range egy egész érték; a for ciklus törzsében az utasítások range-szer hajtódnak végre.
A my_index ciklusváltozó 1-től range-ig fut. Az utasítások között nem lehet a ciklusváltozót megváltoztatni, de értékül adni lehet. A ciklusváltozó csak a cikluson belül látható.
Példaprogram: Szorzótábla
A betaEnv könyvtárban találhatunk még egy "for típusú" ciklusmintát, a forTo-t:
Az inx ciklusváltozó fut lowtól highig. A következő példa bemutatja a forTo használatát; a négyzetszámokat írja ki 9-től 121-ig:
További ciklusmintákat is találhatunk a betaEnv könyvtárban: a cycle és a loop.
Ez egy végtelen ciklus, hacsak az utasítások között nem szerepel a leave my_label; utasítás.
A while illetve az until blokkrész opcionális, nem szükséges mindkettőt megadni. Példa a használatára:
Az előző ciklus integer számokat olvas be mindaddig, amíg vagy egy nempozitív integer írunk be, vagy pedig a beolvasott számok összege meghaladja az 1000-t. A value változót látszólag sehol sem deklaráltuk, valójában a betEnv-ben van deklarálva. Szerepe: a while, illetve az until blokk eredményét kell tartalmaznia, vagyis az értékétől függ, hogy a ciklus ismét lefut-e.
Példa: Négyzetgyök
Ez egy olyan blokk, melyben restart my_label; utasítással vissza lehet térni a blokk elejére, a leave my_label; utasítással pedig el lehet hagyni a blokkot. A címkére csak a blokkon belül lehet hivatkozni.
A dinamikus helyfoglalásra a new operátort kell használni, jele : &
A lefoglalt memória felszabadítása automatikus, ezt a garbage collector (szemétgyűjtő) végzi.
A BETA-ban nincsenek védett változók, minden minta láthat minden más mintában megadott változót.
Egyébként a láthatósági szabályokat a blokkstrukturált nyelvekben megszokott módon adták meg.
Az attribútumokhoz való hozzáférés a szokásos módon, a pont tagkiválasztó operátor (szelektor) segítségével történhet:
A BETA-ban nyelvi szinten nem megoldott az adatok elrejtésének lehetősége, ezt csak a BETA-hoz készített programrendszer (A fragment-rendszer) segítségével lehet némileg szabályozni.