Une fonction est invoquée ou appelée en faisant suivre son nom
d'une liste de paramètres effectifs séparés
par des virgules et entourés entre parenthèses.
Syntaxe d'un appel:
appel_fonction | ::= identificateur_fonction ( liste_param_effectifs ) |
liste_param_effectifs | ::= param_effectif { , param_effectif } |
Exemple:
x := succeseur(3) + 2;
Un paramètre ou argument effectif est une valeur concrètre donnée en entrée à la fonction. Chaque valeur de paramètre effectif est liée au paramètre formel correspondant dans le corps de la fonction. Cette liaison est temporaire, elle dure le temps de l'exécution de la fonction. Dans notre exemple, 3 est la valeur effective donnée au paramètre formel x à l'intérieur de la fonction. Informellement, la sémantique de l'appel succeseur(3) est:
Parfois, nous utiliserons un schéma de substitutions
et de simplifications pour expliquer la sémantique
d'un appel (et des expressions en général).
Ainsi, on remplacera un appel de
fonction par son corps, où l'on a pris soin
de substituer au préalable,
les ocurrences des paramètres formels
par les valeurs des arguments effectifs. Ensuite, on simplifie
les expressions ainsi obtenues jusqu'à retrouver
le résultat final rendu par la fonction.
Dans notre exemple cela donne:
x | := | succeseur(3) + 2; |
:= | ( (x + 1) où x = 3) + 2 | |
:= | (3 + 1) + 2 | |
:= | 4 + 2 | |
:= | 6 |
Lors d'un appel de fonction, il doit y avoir autant de paramètres effectifs qu'il y a eu de paramètres formels déclarés. Chaque paramètre effectif correspond au paramètre formel de même position dans l'entête de la fonction, et doit avoir un type compatible avec celui-ci. Par exemple, pour la fonction:
function f(x : integer; c : character) return ...
l'appel f(`c`, 2) provoque une
erreur de typage à la compilation, alors que
l'appel f(2,`c`) est correct.
Enfin, les paramètres effectifs passés à une fonction doivent avoir une valeur connue, ainsi, trois sortes de paramètres effectifs sont admis:
Les paramètres d'une fonction sont considérés en tant
que constantes, il est impossible de modifier leur valeur.
La fonction
function succeseur(x:integer) return integer is begin x := x + 1; return(x); end succeseur;
produit une erreur à la compilation.