A BLISS programozási nyelv

Alprogramok, modulok



Alprogramok definíciója

Közönséges alprogram definíció

ROUTINE név ( bemenő paraméterek; kimenő paraméterek ) = kifejezés - Egy közönséges rutint definiál adott néven és paraméterekkel. A rutin hívásakor a megadott kifejezést értékeli ki, és adja vissza visszatérési értékként. Ha a rutin nem ad vissza értéket, akkor az = jel elé egy : NOVALUE részt kell betenni. A rutin azon a blokkon belül látható, ahol definiálva van. Példák:

ROUTINE AVERAGE3 ( F1, F2, F3 ) = ( .F1 + .F2 + .F3 ) / 3;

ROUTINE IFACT ( N ) = BEGIN LOCAL RESULT; RESULT = 1; INCR I FROM 2 TO .N DO RESULT = .RESULT * .I; .RESULT END;

ROUTINE RFACT ( N ) = IF .N GTR 1 THEN .N * RFACT ( .N - 1 ) ELSE 1;

Globális alprogram definíció

GLOBAL ROUTINE név ( bemenő paraméterek; kimenő paraméterek ) = kifejezés - Azonos az előzővel, de az így definiált aprogram más blokkokban is látható (explicit deklaráció mellett).

Elődeklaráció

FORWARD ROUTINE név ( bemenő paraméterek; kimenő paraméterek ) = kifejezés - előre deklarál egy alprogramot, ami később közönséges alprogramként vagy globális alprogramként deklarálásra kerül. Például kölcsönen rekurzív alprogramok esetén szükséges az egyik alprogramot elődeklarálni.

Külső alprogram deklaráció

EXTERNAL ROUTINE név ( bemenő paraméterek; kimenő paraméterek ) = kifejezés - egy másik blokkban GLOBAL-ként definiált rutint az aktuális blokkban láthatóvá tesz.

Alprogramok hívása

Példák:

BEGIN OWN A, B; EXTERNAL ROUTINE RFACT; . . . A = RFACT ( .B ) END;

AVERAGE3 ( 5, .A, .B * .C );

IFACT(.A * .B);

Paraméterátadás

A bemenő paraméterek átadása érték szerinti, azonban a formális paraméterek mutatók, de nem az aktuális paraméterek címét tartalmazzák, hanem egy lokális címet, amin az átadott aktuális paraméterek értékei találhatók. Példa:

Az alprogram definíciója:

ROUTINE AVERAGE3 ( F1, F2, F3 ) = ( .F1 + .F2 + .F3 ) / 3;

Egy hívása:

AVERAGE3 ( 5, .A, .B* .C )

Ez a következőnek felel meg:

BEGIN LOCAL F1, F2, F3; F1 = 5; F2 = .A; F3 = .B * .C; ( .F1 + .F2 + .F3 ) / 3 END

Értékek visszaadását paraméterekkel akkor lehet megoldani, ha azok mutatók. Ekkor azonban a mutató dereferenciát kétszer kell alkalmazni. Példa:

Az alprogram definíciója:

ROUTINE EXCHANGE ( X, Y ) : NOVALUE = BEGIN LOCAL TEMP; TEMP = ..X; .X = ..Y; .Y = .TEMP; END;

Egy hívása:

EXCHANGE(Q,R)