A Blue programozási nyelv

Utasítások, vezérlési szerkezetek

Utasítások

Létezik három művelet, amely minden osztályra alkalmazható: az értékadás (:=), az egyenlőségvizsgálat (=) és az egyenlőtlenség vizsgálat (<>). Az értékadás egy objektum referenciát rendel a változóhoz. Az objektum maga nem másolódik át. A nyelvben létezik szimultán értékadás. Ekkor a jobboldali változók kiértékelődnek (nem meghatározott sorrendben) és megfelelő sorrendben hozzárendelődnek a baloldaliakhoz. A jobb oldal kiértékelése mindig befejeződik a hozzárendelések előtt.


Példa:
a,b:=b,a
A fenti példában megcseréltük az a és b értékét.

A összehasonítások két értéket hasonlítanak össze. Az értékek mindig objektum referenciák.


Példa:
var a: myclass b: myclass result: Boolean ... result:= b=a

A result igaz, ha a és b ugyanarra az objektumra hivatkozó referencia. a<>b igaz, ha a és b nem ugyanarra az objektumra hivatkozó referencia.

A komformitás fogalma a következőt jelenti. Egy B típus komform egy A típushoz, ha

Hozzárendelési kisérlet(assignment attempt)

Ez az utasítás megengedi, hogy hozzárendeljünk egy tetszőleges osztály változójához, a-hoz egy alosztályának változóját, b-t. Egy ilyen hozzárendelés akkor biztonságos (nem ad típushibát), ha az a dinamikus típusa komform a b statikus típusához. Ezt nem lehet statikusan meghatározni.


Példa:
var x: A y: B -- B az A egy alosztálya ... y?=x

Statikusan a hozzárendelés sikere nem garantált, mert az x hivatkozhat egy A dinamikus típusú objektumra. Ebben az esetben a hozzárendelés sikertelen, mert a b nem tartalmazhat A típusú referenciát. De x hivatkozhat B dinamikus típusú objektumra, ekkor a művelet sikeres lesz. Ha az x dinamikus típusa komform az y statikus típusához, a hozzárendelés megtörténik, egyébként az y-hoz a nil érték rendelődik hozzá.

Tipusegyenlőség


Példa:

var f: Figure r: Rect -- a Figure leszarmazottja ... if f is Rect then r:=f end if

Az is kulcsszó ellenőrzi, hogy egy változó típusa megegyezik-e a megadottal. Az eredmény egy logikai érték. Az ident is Mytype kifejezés igaz, ha az ident dinamikus típusa komform a Mytype-hoz.

create utasitás


Példa:

var r:Rectangle b:Buffer ... r:=create Rectangle(p1,p2,c) b:=create Buffer

A create kulcsszó a megadott osztály egy objektumát hozza létre és lefuttatja a létrehozó rutinját. Az osztály neve után felsorolt paraméterek meg kell feleljenek a létrehozó rutin paramétereinek. Ha létrehozó rutinnak nincs paramétere, akkor create hívást paraméter nélkül kell megtenni. (Ha az osztály nem specifikál létrehozó rutint, akkor egy paraméter nélküli default rutin generálódik).

a this utasitás


Példa:

list.add(this)

A this az éppen aktív objektumra mutat. Arra használható, hogy megfeleltessük az aktuális objektum referenciát más objektumoknak.

Eljáráshivás

Az eljáráshívás olyan rutin hívását jelenti, amely nem ad vissza értéket.


Példa:
proc proc (a,b) obj.proc(a, 23+17) alist.get(22).put("hello")

Az eljárás lehet belső, vagy külső eljárás. Belső eljárásnak nevezzük azon eljárásokat, amelyeket az eljáráshívást tartalmazó osztályban definiáltunk. Külső eljárás olyan eljárás, amelyet más osztályban definiáltunk. A külső eljáráshívásokat egy objektumazonosító vezeti be, amelyet egy pont (.) választ el az eljárás nevétől. Ha az eljárásnak van paramétere, akkor a hívásnál megadjuk az aktuális paramétereket zárójelek között. Ha nincs paramétere, elhagyjuk a zárójeleket.

return

A return utasítás egy rutinból való visszatéréshez használható.


Példa:
show is == megjeleníti az elemet a standard outputon do if name = "" then return ... end show

A return utasításnak nincsen paramétere. Ha a rutin egy függvény, minden visszatérési értéknek értéket kell adni a return végrehajtása előtt.

az input/output

Az I/O a Blue-ban a nyelv által nyújtott standard osztályokon és objektumokon keresztül történik. Két csoportja van az I/O osztályoknak: egy csoport a szöveges I/O számára, és egy a grafikus felületépítésre. A grafikus felületre itt most nem térünk ki.

A Blue négy környezeti változót biztosít az input/output-ra: input, output, terminal, és format. Ezek a változók előre definiáltak, és minden osztályból elérhetők.


Példa:
var input : IO_Channel output : IO_Channel terminal : TextTerminal format : OutputFormat

A standard output


Példa:
i: Integer m: Myclass print (i) print (m) print ("The value of ", i, " is ", m, "\n")
A print a következő alias: print(a, b, ...) <==> output.write(str(a, b, ...)) Az str maga is egy alias: str(a, b, ...) <==> a.toString.concat(b.toString.concat(...))

A standard input

A beviteli műveletek a standard inputról az integerek, a valósak, a boolean és a string típusú értékekhez vannak előre definiálva. Az alábbi aliasokkal valósították meg ezeket:
Példa:

readInt <=> input.readInt readReal <=> input.readReal readStr <=> input.readStr readChar <=> input.readChar

Ezen rutinok mindegyike függvény, mely referenciát ad vissza a megfelelő típusra.


Példa:
num := readInt name := readStr line [i] := readChar

A readInt és a readReal elnyeli a fehérelválasztó és sorvége karaktereket. Formátumhiba esetén nil-t adnak vissza. A readStr sor vagy file végéig olvas.

Vezérlési szerkezetek

Elágazás

Két fajtája van az elágazásnak, az if-es és a case-es.


Az első a következőképpen néz ki:
if val>0 then positiv_proc elseif val=0 then zero_proc else print('Az érték negatív!') end if

A case is hasonló a C-ben megismerthez:
case colour of {red}: label:="danger" {yellow}: label:=warning" {green}: label:="okay" else error_proc end case

Annál azonban többet is nyújt:
case ch of {" ", "\n", "\t"}: handle_whitespace {"a".."z", "A".."Z", "_"}: handle_letter {"0".."9"}: handle_number else handle_error end case

Ha a case-ben lévő halmazok nem diszjunktak, akkor az először illeszkedő ág hajtódik végre.

Ciklus

Csak egy ciklus létezik a nyelvben. Ez a loop...end loop környezettel lett definiálva. A ciklusból az exit on kulcsszóval lehet kilépni, amely kulcsszó a ciklus része. A ciklus elejére vagy végére téve a kulcsszót lehet elérni az elől vagy hátul tesztelős ciklust (mely megfelel a while...do és repeat...until ciklusnak a Pascalban).


Az első példa az elől tesztelős ciklust mutatja be:
list.first loop exit on list.atEnd print(list.current) list.advance end loop

A Blue ciklusban az exit utasítás tetszőleges helyen megjelenhet:
loop readInt(i) exit on i>0 print("0-nál nagyobb számot kérek!") end loop

Egy ciklusban több exit utasítás is elhelyezhető:
loop s:=getSelection exit on s=0 error:=process(s) exit on error end loop

Az exit nélküli loop fordítási hibát okoz. Exit utasítás nem szerepelhet cikluson kívül. Beágyazott ciklusban az exit csak a legbelső ciklusból való kilépést eredményezi. Külsőbb ciklusból való kiugrásra nincs lehetőség.