Prozedur-Vereinbarung


Die Vereinbarung einer Prozedur (oder Funktionsprozedur) besteht aus einem Prozedurkopf und einem Prozedurrumpf.

Im Kopf steht die Beschreibung der Parameter, also der beim Aufruf durch Argumente zu ersetzenden Bezeichner mit Angaben über ihre Verwendung, und als wichtiger (dennoch leider oft weggelassener!) Bestandteil die Beschreibung des  Kontraktes, also der zu erbringenden Leistung unter Angabe der Voraussetzungen. Diese gesamte Information gehört auch, sofern die Prozedur durch ein Modul exportiert wird, in das zugehörige Definitionsmodul; sie enthält alles, was der Aufrufer über die Prozedur wissen muß, und nicht mehr.

In Modula 2 hat ein Prozedurkopf folgendes Format:

PROCEDURE <Prozedurname> <Parameterangabe> ;
Dazu kommt als Kommentar die Leistungsbeschreibung.

Die <Parameterangabe> ist nach folgenden Regeln gebaut:

<Parameterangabe> ( <Parameterliste> )
<Parameterangabe> <leer>
Die Prozedur braucht also keine Parameter zu haben; dann besteht ihr Effekt nur aus "Nebenwirkungen" oder "Seiteneffekten". Die Parameterliste ist falls nötig durch Strichpunkte getrennt:
<Parameterliste> <Parameterliste> ; <Parameter>
<Parameterliste> <Parameter>
Für formale Parameter gibt es (in Modula 2 und verwandten Sprachen) zwei Formate:
<Parameter> <Bezeichner> : <Typ>
Dies ist ein "Wert-Parameter"; er kann wie eine lokale  Hilfsvariable verwendet werden, deren Inhalt anfangs der beim aktuellen Aufruf übergebene Wert des Arguments ist.
<Parameter> VAR <Bezeichner> : <Typ>
Dies ist ein "Referenz-Parameter"; er ist ein zusätzlicher  Name, über den das beim aktuellen Aufruf angegebene externe Objekt angesprochen und auch verändert werden kann.

Die Schreibweise kann oft vereinfacht werden: mehrere aufeinanderfolgende Parameterangaben gleicher Art und gleichen Typs kann man zu einer durch Kommas getrennten Liste zusammenfassen.

Der Rumpf ist ein Block, also eine Anweisungsfolge zusammen mit lokalen Objekten, für deren Bezeichner er den Gültigkeitsbereich darstellt. Auch die ganze Vereinbarung ist ein Block, der den Rumpf umfaßt; hier kommen als neue gebundene Bezeichner die Parameter hinzu.

Alle Bezeichner im Rumpf, die weder durch eine lokale Vereinbarung noch eine Parameter-Angabe gebunden sind, sind frei; über sie kann auf globale Objekte zugegriffen werden, sofern diese in einem umfassenden Block vereinbart sind. Solche Seiteneffekte umgehen die Schnittstelle und sind daher riskant, aber gelegentlich unvermeidlich (etwa bei Ausgabeoperationen).


zurück | Inhalt | Index | vor | Vorlesung

Klaus Lagally, 22. Februar 2000, 19:36