A Cobra programozási nyelv

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



Értékadás

A Cobra programozási nyelvben a hagyományos, a = b szintaktikájú értékadáson túl egy a ?= b alakú értékadást is bevezettek a nyelv készítői, amely csak abban az esetben ad új értéket (b értékét) az a változónak, ha az az értékadás utasítás végrehajtásának pillanatában NIL értékű, azaz inicializálatlan volt. Tehát az a ?= b típusú értékadás szemantikája az alábbi pszeudokódéval ekvivalens:

if a==NIL then a=b else skip;

Ez a nyelvi eszköz az inicializálatlan változók kezdeti értékének beállítását biztosítja, igen tömör formátumban megadva. Természetesen b típusának mindkét értékadás esetében kompatibilisnek kell lennie a típusával
A Cobra készítői igen fontos feladatnak találták, hogy a program futása közben fellépő null pointer exceptionök számát minimálisra redukálják, így született meg a kérdőjeles értékadás mellett a kérdőjeles paramétertípus megkülönböztetése, amely felvehet NIL értéket is, ellentétben a hagyományos típusokkal, melyek garantáltan nem lehetnek inicializálatlanok.
Emellett létezik a kérdőjeles coalesce kifejezés is, szintaxisa a ? b, amely a kérdőjellel elválasztott kifejezések közül az első nem NIL értéket adó kifejezésre értékelődik ki. Tehát a példában a kifejezés értéke a értéke lesz, ha az nem NIL, különben pedig b értéke. Ha mindkettő NIL, akkor a kérdőjeles kifejezés értéke is NIL.
#1. példa print name ? 'NONAME' # 2. példa def foo(factor as decimal?) factor ?= 1 # 3.példa get name as String return _name ? .getType.name # 4.példa name = if(employee.manager.name<>nil, employee.manager.name, 'NONAME') name = employee.manager.name ? 'NONAME'

A 4. példában szereplő első megoldás akár kétszer is kiértékelheti a feltételt és kevésbé tömör, átlátható, mint a kérdőjelet használó megoldás.

Szekvencia

A több sorba írt szekvencia utasításokat a Cobrában nem szükséges pontosvesszővel vagy egyéb karakterrel elválasztani.

Elágazás

Az elágazás utasítást a következő szintaxissal adhatjuk meg:

if-statement = if expression statements (else if expression statements)* [else statements]

Az if utasítás feltételtől függően választja ki a végrehajtandó kódblokkot.
Mint a példában is látható, a blokkszerkezetet Cobrában, a Pythonhoz hasonlóan, indentálással, behúzással jelölhetjük, nincs semmilyen „felesleges” karakter a blokkok jelzésére, ami jól átlátható, tömör kódot eredményez, azonban adott esetben komoly odafigyelést igényelhet a programozótól nagyobb kódrészletek írásakor, másolásakor.
Az if utasításnak van egy if kifejezés párja is, amely az első paraméterben megadott feltétel igaz értéke esetén az első, különben a második paraméterre értékelődik ki (hasonló ez a szerkezet a C szintaktikájú nyelvek condition ? a : b eleméhez).
if(condition, texpr, fexpr)

A condition feltétel minden esetben kiértékelődik, a megfelelő kifejezés pedig akkor, ha feltétel kiértékelése során nem lépett fel kivétel.
Az esetszétválasztásos elágazás a következő szintaxissal adható meg:
branch WHAT on VALUE1 STATEMENTS1 on VALUE2 STATEMENTS2 [else STATEMENTS]

Ciklus

A while típusú ciklusok a következő módon adhatóak meg:

while-statement = [post] while expression statements

Mint látható, a hátul tesztelős ciklusok annyiban különböznek szintaktikailag az elől tesztelősöktől, hogy eléírjuk a post kulcsszót a ciklusnak.
A for ciklusokkal végigiterálhatunk egy megfelelő objektumon, amely az IEnumerable interface-t implementálja.
enumerable-for-statement = for variable in expression statements

for person in people print person

A for ciklusnak is van egy megfelelő for kifejezés párja, amely végigiterál egy listán, és minden olyan esetben, amikor az aktuálisan vizsgált elemre teljesül a megadott feltétel, akkor egy másik listához hozzáfűz egy új elemet, melyet a for kifejezésben meghatározott szabály szerint képez az eredeti lista eleméből.
for var in ienumerable [where condition] get expr for var in ienumerable where condition

t = for x in [1, 2, 3] where x>=2 get x*x # `x` típusa int, `t` típusa List<of int>