Icon

Alprogramok

Eljáráshívás

Az eljáráshívás formája a következõ:

kifejezés0 ( kifejezés1, kifejezés2, ... , kifejezésN )

Eljárások deklarálása

Az eljárásdeklaráció formája a következõ:

procedure név ( param1 , ... , paramN ) *deklarációk* initial ... *kifejezés(ek szekvenciája)* end

Kezdeti érték hozzárendelése a paraméterekhez

Lehetõségünk van minden paraméterhez meghatározni egy kezdeti értéket a következõképp:

parameter_nev := kezdeti_ertek

Az Iconban ha nem adunk meg egy paramétert, akkor az értéke &null lesz. A / akkor lesz sikeres, ha &null a paraméter értéke és ekkor értékül adja neki az általunk meghatározott kezdeti értéket.

Visszatérési érték

Az eljárás visszaadhat egy értéket a return kifejezéssel:

return kif

vagy

return

Generátor eljárás

A suspend segítségével az eljárásunkat generátorrá alakíthatjuk. Hasonlóképp működik mind a return, azt leszámítva, hogy így az eljárásunk több értéket is szolgáltathat. Formái:

suspend e1 do e2 suspend e1 suspend

A működése a következõ:

Példa:

procedure G() suspend |writes(" e1")\3 do writes(" e2") write() suspend |writes(" e3")\2 write() end procedure main() every G() do writes(" e4") end

Ez a program a következõket írja ki:

e1 e4 e2 e1 e4 e2 e1 e4 e2 e3 e4 e3 e4

Initial

Az eljáráson belüli statikus változók megõrzik értéküket az eljáráshívások közben, de természetesen az elsõ hívás problémát jelent: a változóknak ekkor még nincs értékük. Erre szolgál a kezdeti deklaráció:

initial e

A tartalmazott e kifejezés csak egyszer fog lefutni, méghozzá az eljárás legelsõ meghívásakor. Természetesen ezt más változók inicializálására is használhatjuk. Például tegyük fel, hogy van két eljárásunk a enqueue(x) és a dequeue(), amik egy listába tesznek be illetve vesznek ki elemet. A használatuk elõtt azonban inicializálnunk kell a listát:

global queue procedure enqueue(x) initial /queue:=list() ... end procedure dequeue() initial /queue:=list() ... end

Ezáltal mindkettõben ellenõrizzük, hogy inicializáltuk-e már a sort, és ha nem, akkor megtesszük most.