Az Algol68 programozási nyelv

Eljárások



Eljárások

Az eljárások olyan objektumok amelyeknek értékük van, ezen kívül eljárás változókat is definiálhatunk. Eljárásokat a következőképpen definiálunk:

proc maximum = (int a,b) int: begin if ab then a else b fi end

Megjegyzendő, hogy a kettőspont utáni rész, az eljárás törzse, egy unit. Az eljárás visszatérési értéke a törzsében szereplő utolsó unit értéke. Ha az éppen nem a kívánt, akkor utolsó utasításnak egyszerűen oda lehet írni a visszaadandó értéket, ami unit lévén utasításként állhat. A begin end pár itt felesleges. Egy eljárásnak tetszőleges számú paramétere lehet, de a hívásnál pontosan ugyanannyinak szerepelnie is kell. Fontos, hogy a

proc recip = (real x) real: 1.0/x

eljárás törzsben x módja real és nem ref real. A fenti eljárásban az x := 2.0 fordítási hibát okozna. Magyarul érték szerinti paraméter átadás van. Ha cím szerinti paraméter átadást akarunk, akkor ezt a formális paraméterlistában a ref szócskával kell jelezni:

proc set = (ref real x, real y ) void: begin x := y end

A paraméter átadás során először a paraméterek, ha ez szükséges, a megfelelő módra konvertálódnak, majd kiértékelődnek (ne felejtsük el, hogy egy paraméter egy 10 oldal hosszú unit is lehet), ezután az aktuális paraméterekről másolat készül, ami végül átadódik az eljárásnak, és amire minden, a formális paraméterre vonatkozó referencia hivatkozik. Így a paraméterek mindig csak egyszer értékelődnek ki.

Változó számú paraméterű eljárást elvileg nem definiálhatunk, de gyakorlatilag igen, a következő módon: a formális paraméter legyen egy definiálatlan hosszú tömb, (a tömb típusába nem tartozik bele a mérete) ekkor meghíváskor az aktuális hosszt az lwb és upb operátorokkal határozhatjuk meg az eljáráson belül. Ezért van duplazárójel pl.: az I/O utasításoknál, ahol valójában egy tömböt adunk át.

A fentiek mind eljárásdefiniciók voltak, eljárás változókra példa.:

proc (real) real f, g; f := (real r) real: r*r*2; # az értékadás jobboldala egyben rutinszövegre is példa # g := recip;