Szintaxis
<eljárásfej> ::= <eljárásazonosító> <formális paraméterlista>;
<paraméterátadási mód specifikációja> <típusspecifikációja> <típusspecifikáció>
<paraméterátadási mód specifikációja> ::= <érték-szerinti paraméterátadás specifikációja>
<név-szerinti paraméterátadás specifikációja>
| <név-szerinti paraméterátadás specifikációja>
<érték-szerinti paraméterátadás specifikációja>
<név-szerinti paraméterátadás specifikációja> ::= name <azonosítólista>; | <üres>
<specifikátor> ::= <típus> | ARRAY | <típus> ARRAY | LABEL | SWITCH | PROCEDURE | <típus> PROCEDURE
<paraméterelhatároló> ::= ,
Eljárások, függvények, paraméterátadás
Az eljárások tekintetében a SIMULA 67 eltér az ALGOL 60 programozási nyelvtől:
- Az összes formális paraméter típusát specifikálni kell.
- Az ALGOL 60-ban ismert string típust a SIMULA 67-ben a text helyettesíti.
- A név szerinti paraméterátadási módot az eljárás fejlécében lehet meghatározni.
Ez nem az alapértelmezés szerinti paraméterátadási mód, mindig külön specifikálni kell.
- A név szerinti paraméterátadás újradefiniálódik, ha az aktuális paraméter típusa nem egyezik meg a formális specifikáció típusával.
- Tömbparaméterek esetében teljes típusegyezés szükséges a paraméterátadási módra való tekintet nélkül.
- SIMULA 67-ben nincs lehetőség túlterhelésre (overloading).
- Egy eljárásnak megadhatunk eljárás, vagy függvény típusú paramétert is. Eljárás, vagy függvény definiálásakor nincs kötött paraméterszám.
A paraméterek típusát az eljárás, ill. függvény fejlécében egy kicsit szokatlan módon kell megadni:
integer procedure myproc(a, b, c, F); name a; value b; real a; text b; ref(X) c; Boolean procedure F;
Ez egy integer értéket visszaadó függvény, amelynek egy real, egy text, egy ref(X) típusú érték és egy Boolean visszatérési értékű függvény a paramétere. A paraméterátadásnak három módja van: érték, hivatkozás és név szerinti. Érték típusú paraméterekre az érték szerinti, az összes többi paraméterre pedig a hivatkozás szerinti paraméterátadási mód az alapértelmezés. Az 'a' paraméterre explicit módon név szerinti paraméterátadást (name) definiál a függvény az érték szerinti alapértelmezéssel szemben. Ehhez hasonlóan a 'b' paraméterre explicit módon érték szerinti paraméterátadást (value) határoz meg a függvény a hivatkozás szerinti alapértelmezéssel szemben.
Az eljárásparaméterek különböző fajtáira alkalmazható paraméterátadási módokat a következő táblázat tartalmazza:
(A : alapértelmezés, V : választható, I : illegális)
Paraméter | érték szerinti | hivatkozás szerinti | név szerinti |
érték típusú | A | I | V |
objektumhivatkozású | I | A | V |
szövegtípusú | V | A | V |
érték típusú tömb | V | A | V |
hivatkozás típusú tömb | I | A | V |
eljárás | I | A | V |
függvényeljárás | I | A | V |
címke | I | A | V |
kapcsoló | I | A | V |
Érték szerinti paraméterátadás
A formális paraméter egy lokális változó, melynek kezdőértéke a neki megfelelő aktuális paraméter kiértékelésével kapott érték. Az aktuális paraméterek kiértékelése az eljárásba való belépéskor, ill. egy objektum generálásakor történik meg. Az objektumhivatkozási és hivatkozás típusú array paraméterekre az érték szerinti paraméterátadás illegális.
Hivatkozás szerinti paraméterátadás
A hivatkozás szerint átadott formális paraméter a neki megfelelő aktuális paraméter kiértékelésével kapott hivatkozás. Az aktuális paraméterek kiértékelése az eljárásba való belépéskor, ill. egy objektum generálásakor történik meg. A hivatkozás szerint átadott tömb, eljárás, címke és kapcsoló paraméter az eljárás vagy osztálytörzsön belül nem lehet megváltoztatni. A hivatkozás szerint átadott tömbparaméternél az aktuális paraméter típusának egybe kell esnie a formális paraméter típusával. Hivatkozás szerint átadott eljárásparamétereknél az aktuális paraméter típusa a formális paraméter típusával megegyező lehet, vagy pedig annak alárendelt típusa.
Név szerinti paraméterátadás
A névszerinti paraméterátadás az eljárásparaméterek egy átadási módja, nem alapértelmezés. Hasonlóan, mint az ALGOL 60-ban, ez egy szövegszerű helyettesítést jelent. A névszerint átadott paraméterek minden egyes futás közbeni előfordulása egy kifejezés ismételt kiértékelését idézheti elő. A név szerinti paraméterátadás tulajdonképpen olyan mint egy makróhívás.
Példa: egészértékű függvény két input paraméterrel (kiszámolja a legnagyobb közös osztót):
Begin
Integer Procedure GCD(M, N); Integer M, N;
Begin
While M<>N do
If M<n then N := N - M else M := M - N;
GCD := M
End of GCD;
Integer A, B;
OutText("Enter an integer number: "); OutImage; A := InInt;
OutText("Enter an integer number: "); OutImage; B := InInt;
OutText("Greatest Common Divisor of your numbers is ");
OutInt(GCD(A,B), 4); OutImage;
End of Program;