A BLISS programozási nyelv

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



Utasítások mint kifejezések

A BLISS-32 nyelvben minden utasítás kifejezés, azonban a más programnyelvekkel való párhuzam és az oldalon való könyebb tájékozódás miatt a vezérlő és blokk kifejezések átkerültek erre az oldalra.

Blokkok

Kerek zárójelek vagy BEGIN és END közé zárt kifejezés. Értéke mindig az utolsó pontosvessző utáni kifejezés értéke. A blokkot megelőzheti egy címke is, amelyet egy kettőspont választ el a blokktól. Példa:

5 * ( .A + .B ) ! Kerek zárójelek segítségével létrehozott blokk X = BEGIN LOCAL T; T = 2 + F ( ); T = .T * G ( .T ); .T END ! BEGIN-END segítségével létrehozott blokk

Elágazás

Egyszerű feltételes kifejezések

IF logikai kifejezés THEN nem nulla ág ELSE nulla ág. Ez utóbbi elhagyható. A kifejezés értéke a megfelelő ág értéke lesz. Egymásba ágyazott feltételes kifejezések esetén az ELSE ág mindig a belső IF-hez tartozik. Példa:

IF .X GTR XMAX THEN F(.X) ELSE G(.X);

Többágú feltételes kifejezések

CASE kifejezés FROM alsó határ TO felső határ OF SET ágak TES, és az egyes ágak [ értékhalmaz ] : kifejezés alakúak, ahol az értékhalmaz egy vagy több érték-címke, egymástól vesszővel elválasztva. Egy érték-címke lehet egy egyszerű érték, lehet alsó határ TO felső határ alakú intervallum, valamint lehet INRANGE (egyéb a megadott intervallumon belül) és OUTRANGE (a megadott intervallumon kívüli) is. Az intervallum minden értéke legfeljebb egy ágban szerepelhet, és ha az ágak címkéi nem fedik le a teljes intervallumot, akkor a végén szerepelnie kell az INRANGE ágnak is. Ha az intervallum nem fedi le a változó által felvehető összes értéket, szerepelnie kell az OUTRANGE ágnak, ami állhat az INRANGE után is. A kifejezés értéke a kiválasztott ág értéke lesz. Példa:

CASE .X+1 FROM -1 TO 8 OF SET [ 1 ] : F1 ( ); [ 2 TO 4 ] : F2 ( ); [ 5, 7, - 1 ] : F3 ( ); [ INRANGE ] : F4 ( ); [ OUTRANGE ] : F5 ( ); TES

Szelekciós kifejezések

SELECT, SELECTU, SELECTA, SELECTONE, SELECTONEU vagy SELECTONEA kifejezés OF SET ágak TES, és az egyes ágak [ értékhalmaz ] : kifejezés alakúak, ahol az értékhalmaz egy vagy több érték-címke, egymástól vesszővel elválasztva. Egy érték-címke lehet egy egyszerű érték, lehet alsó határ TO felső határ alakú intervallum, valamint lehet ALWAYS (mindig kiválasztódik) és OTHERWISE (akkor választódik ki, ha előtte egy sem) is. A CASE utasítással szemben itt az egyes ágak értékei futási időben kerülnek kiszámításra, egy érték többször is szerepelhet, nem lehet megszorítani a kifejezést egy intervallumra és van külön előjeles, előjel nélküli (U végű) és címeken működő (A végű) változata is. A SELECT minden olyan ágat kiválaszt, amelynek az értékhalmazába a kifejezés értéke beleesik, míg a SELECTONE csak az első ilyet. A kifejezés értéke a kiválasztott ág értéke lesz. Példa:

SIZE = ( SELECTONE .VALUE OF SET [ - 128 TO 127 ] : 1; [ - 32768 TO 32767 ] : 2; [ OTHERWISE ] : 4; TES )

Ciklus

Indexes ciklus kifejezések

INCR, INCRU, INCRA, DECR, DECRU vagy DECRA ciklusváltozó FROM kezdőérték TO végérték BY lépésköz DO kifejezés. A ciklusváltozó kezdőértéktől a végértékig növekszik (INCR, INCRU, INCRA) vagy csökken (DECR, DECRU vagy DECRA) a megadott lépésközzel, és minden növelés vagy csökkenés előtt kiértékelődik a DO után álló kifejezés. A ciklusváltozót nem kell előre deklarálni. Az INCR és DECR előjelesen, az INCRU és DECRU előjel nélkül, az INCRA és DECRA pedig címként értelmezi a ciklusváltozó értékeit. A kifejezés értéke -1 lesz. Példa:

OWN V : VECTOR [ 10 ], SUM; ... SUM = 0; INCR I FROM 0 TO 9 DO SUM = .SUM + .V [ .I ];

Elöltesztelt ciklus kifejezések

WHILE vagy UNTIL feltétel DO kifejezés. A feltétel kiértékelődik, és ha WHILE esetén nem nulla, UNTIL esetén nulla az értéke, akkor a kifejezés is kiértékelésre kerül. Ezután kezdődik minden elölről, a feltétel kiértékelésétől. Ha a feltétel értéke WHILE esetén nulla illetve UNTIL esetén nem nulla, a ciklus kifejezés kiértékelése befejeződik. A kifejezés értéke -1. Példa:

WHILE .PTR NEQ 0 DO BEGIN SUM = LIST [ .PTR, CONT ]; PTR = LIST [ .PTR, LINK ]; END;

Hátultesztelt ciklus kifejezések

DO kifejezés WHILE vagy UNTIL feltétel. A kifejezés kiértékelődik, majd a feltétel. Ha ez utóbbi értéke WHILE esetén nem nulla, UNTIL esetén nulla, akkor kezdődik minden elölről a kifejzés kiértékelésétől. Ellenkező esetben a ciklus kifejezés kiértékelése befejeződik. A kifejezés értéke -1. Példa:

DO BEGIN SUM = LIST [ .PTR, CONT ]; PTR = LIST [ .PTR, LINK ]; END UNTIL .SUM GEQ 100;

Kilépő kifejezések

LEAVE címke WITH kifejezés vagy EXITLOOP kifejezés. A LEAVE egy adott címkéjű blokk elhagyására szolgál. Ha nincs megadva visszatérési érték, akkor a blokk értéke definiálatlan lesz, különben felveszi ezt a visszatérési értéket. Az EXITLOOP egy ciklusból való kilépésre szolgál. A visszatérési érték megadása itt sem kötelező, ez is definiálatlan lesz, ha nincs megadva. Példák:

LEAVE ALPHA WITH .X-1;

OWN X : VECTOR [ 10 ], ZEROFLAG; ... ZEROFLAG = 0; INCR I FROM 0 TO 9 DO IF .X [ .I ] EQL 0 THEN ( ZEROFLAG = 1; EXITLOOP );

OWN XYZ : ARRAY [ 10, 20 ], ZEROFLAG; LABEL L; ... ZEROFLAG = 0; L : BEGIN INCR I FROM 0 TO 9 DO INCR J FROM 0 TO 19 DO IF .XYZ [ .I, .J ] EQL 0 THEN ( ZEROFLAG = 1; LEAVE L ); END;

OWN VALBUF : VECTOR [ 10 ], BUFLEN; ... BUFLEN = 1 + BEGIN DECR J FROM 9 TO 0 DO IF .VALBUF [ .J ] NEQ 0 THEN EXITLOOP .J END;

Vezérlésátadás

Rutin hívások

Példa:

X = F( ) P(5, .X, UPLIT('MESSAGE'))

Visszatérő kifejezések

RETURN kifejezés. Egy rutinból való kilépésre szolgál, adott visszatérési értékkel. Ha a rutin visszatérési értéke nem NOVALUE, akkor a visszatérési értéket meg kell adni.