<Prozedurname> <Argumentliste>die sich durch die folgenden Regeln beschreiben läßt:
<Prozedurname>Die Argumentliste kann also fehlen.<Bezeichner>
<Argumentliste>( <Argumente> )
<Argumentliste><leer>
<Argumente>Die Argumente werden also durch Kommas getrennt.<Argumente> , <Argument>
<Argumente><Argument>
<Argument>Dies ist ein Wert-Argument; der Ausdruck wird ausgewertet, und das Ergebnis wird der Prozedur übergeben.<Ausdruck>
<Argument>Dies ist ein Referenz-Argument; die Variable bezeichnet ein Objekt, das die Prozedur ansprechen und auch verändern können soll.<Variable>
Wert-Argumente und Referenz-Argumente sind in Modula 2 an der Aufrufstelle der Prozedur oft nicht zu unterscheiden; der Unterschied zeigt sich in der Form der Prozedur-Vereinbarung, und natürlich gehört er zum Kontrakt.
Ein Funktionsaufruf sieht (fast) genauso wie ein Prozeduraufruf aus, doch steht er an einer anderen Stelle: nicht als Anweisung, sondern als Ausdruck, oder als Operand eines Ausdrucks, da er ja einen Ergebniswert zurückliefert. Hier sollten nur Wert-Argumente verwendet werden, und bei (selten vorkommenden) parameterlosen Funktionen muß in Modula 2 merkwürdigerweise dennoch eine leere Parameter-Klammer geschrieben werden. (Die in der Sprache C gegebene Möglichkeit, einen Funktionsaufruf auch als Anweisung zu verwenden und den Ergebniswert "wegzuwerfen", ist logisch unsauber und fehleranfällig).
Andere Programmiersprachen bieten gelegentlich noch weitere
"Parameter-Übergabemechanismen" wie "call by value/result"
oder "call by name" an; wir gehen darauf hier nicht ein.