A BETA programozási nyelv

Típusok, típuskonstrukciók



Elemi típusok

A nyelv részét képező alaptípusok a következők:

Az integer típusra a +, -, *, div és mod függvény-minták alkalmazhatók, ezek a szokásos aritmetikai műveleteket jelentik. Az egész értékű kifejezésekben a szokásos infix jelölést használhatjuk. A BetaEnv könyvtárban a Min, Max és Abs függvények is megtelálhatók:

i,j,k: @integer; ... 1+i->i; i*j+12->k; (42,k)->Max->putint;

Kis egész értékek ábrázolására használhatjuk a ShortInt típust is (ez a Mjølner rendszerben 16 bites, előjeles egész). E típusnak nem létezik az object megfelelője.

A boolean típushoz a not, and, or és xor függvény-minták definiáltak. Használatuk a szokásos infix jelöléssel történik (a not prefix). A false és true konstans minták a logikai "igaz" és "hamis" értékeket reprezentáló objektumok.

A char típus egy ASCII karaktert reprezentál. Minden karakter egy [0,255] intervallumba eső egész értéknek felel meg. A karakterek típuskompatibilisek az integerekkel, kifejezésekben felcserélhetőek egymással. A char objektumokra alkalmazhatóak az integer típus műveletei. Például az ’a’ + 1 -> b értékadás az ’a’ ASCII érték plusz egyet rendel a b változóhoz. Mivel az ’a’ ASCII értéke 97, és a ’b’ ASCII értéke 98, a b változó értéke a ’b’ karakter lesz.

A lebegőpontos számokat reprezentáló real típusra a +, -, * és / aritmetikai műveletek definiáltak. (A Mjølner BETA System jelenlegi implementációja egy 64-bites reprezentációt alkalmaz.)

Relációs operátorok: Az =, <>, <, <=, >, >= relációk a szokásos jelentéssel bírnak, és alkalmazhatók az integer, boolean, char és real objektumokra. (A boolean-ra: a 'false' minta olyan objektumokat ír le, melyek kisebb-egyenlőek, mint azok az objektumok, melyeket a 'true' minta ír le. A char objektumokra az ASCII kód szerinti sorrend érvényes.)

A deklarált változók automatikus kezdeti értékei: az Integer objektumok kezdeti értéke 0; a char objektumok kezdeti értéke 0 (null karakter); a boolean objektumok kezdeti értéke a 'false'; a real objektumok kezdeti értéke 0.0.

A BetaEnv könyvtárban előre definiált konstansok, melyek az egész és valós típusok minimális és maximális értékét tartalmazzák: MinInt és MaxInt, illetve MinReal és MaxReal.

Van egy beépített szöveg típus, a text, amit karaktertömbbel valósítottak meg.

Ha a programban leírjuk egy változó nevét, akkor az a változó által mutatott objektumot jelenti. Külön kell jelölni, ha az objektum címére van szükség. Az alaptípusokra nem hozhatunk létre dinamikus referenciát, csak statikusat, viszont létezik minden alaptípushoz egy-egy becsomagoló minta (ezek név szerint: IntegerObject, CharObject, RealObject, BooleanObject), melyekre már lehet dinamikus referenciát állítani.

Összetett típusok

Tömbök

A tömböket csak egész számokkal lehet indexelni, az első elem indexe 1.

Példa - tömbök deklarációja:

int_array: [10] @integer; (* egész értékek tömbje *) HIBAarray: [10] ^integer; (* din. ref. alapmintára tilos *) din_array: [10] ^integerObject; (* helyette használjuk ezt! *) ... my_pattern: (* saját minta deklarációja *) (# square_number: @integer; #); my_array: [5] ^my_pattern; (* dinamikus referenciák tömbje *)

Értékadás a tömbök elemeinek:

42 -> int_array[4]; (* értékadás *) ... (for i: my_array.range repeat (* i fut 1-től a max. indexig *) &my_pattern[] -> my_array[i][]; (* memória a dinamikus ref.nak *) i*i -> my_array[i].square_number; (* csak aztán kaphat értéket *) for);

A BetaEnv könyvtár három műveletet biztosít a tömbökre:

R.range Visszatérési értéke az R tömb mérete.
n->R.new Egy n elemű tömböt allokál dinamikusan.
n->R.extend Az R tömböt kibővíti további n darab elemmel.

A tömb ismeri a méretét, a "my_array.range" formában lehet rá hivatkozni.
A tömb mérete dinamikusan változtatható: az "n->my_array.extend;" utasítás n-nel növeli a my_array tömb méretét.
Az "n->R.new;" utasítás hatására egy új n elemű tömb allokálódik a memóriában. A régi elemek elérhetetlenné válnak (ez már a garbage collector dolga), az új elemek felveszik alapértelmezett értéküket.

my_array.range->putint; (* A my_array mérete: 10 *) newline; 16->my_array.extend; my_array.range->putint; (* A my_array mérete: 10 + 16 = 26 *)

Hivatkozhatunk egy tömb résztömbjére. A my_array i-edik elemétől j-edik eleméig tartó résztömbje: my_array[i:j]
Egy tömb értékül adható egy másik tömbnek egyszerű értékadással, például: "my_array->your_array;" ez után a your_array mérete azonos lesz a my_array méretével.

(# my_array: [10] @integer; your_array [20] @integer; do my_array.range->putint; (* A my_array mérete: 10 *) newline; your_array.range->putint; (* A your_array mérete: 20 *) newline; my_array[7:9]->your_array; your_array.range->putint (* A your_array mérete: 3 *) #)

Példa: Quicksort

Rekord, unió

Ha egy mintában nem szerepel programtörzs és tagfüggvény - vagyis a elhagyjuk a do részt, illetve a deklarációs részben nem szerepel újabb mintadeklaráció -, akkor a mintát felfoghatjuk rekord típusnak. Ha az enter és exit részben felsoroljuk a deklarált adattagokat, akkor a mintából példányosított objektum adattagjai egyszerre feltölthetők, illetve az objektum értékül adható a -> operátorral. Egy objektum adattagjait a pont tagkiválasztó (szelektor) operátorral érhetjük el.

record_pattern: (# a,b: @integer; enter (a,b) exit (a,b) #); my_record, your_record: @record_pattern; ... do (42,43)->my_record; (* adattagok feltöltése egyszerre *) my_record->your_record; (* értékadás rekordok között *) 8->my_record.a->your_record.b; (* szelektor *)

A BETÁ-ban nincs unió és halmaz típus, a tömbön kívüli egyetlen típuskonstrukciós eszköz a minta. A minta felfogható úgy, mint más programnyelvekben az osztály, azzal a kiegészítéssel, hogy minden mintának megadható egy programtörzs, paraméterek és visszatérési érték.