“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 57 — #67
i
i
i
i
i
i
i
i
2.4 La sémantique du langage noyau
57
Les procédures
Les procédures sont un des plus importants éléments primitifs du langage. Nous
donnons un exemple simple qui montre comment définir et appeler une procédure.
Voici une procédure Max qui lie Z au maximum de X et Y :
proc {Max X Y ?Z}
if X>=Y then Z=X else Z=Y end
end
Pour faciliter la lecture de cette définition, nous marquons l’argument de sortie avec un
point d’interrogation « ? ». Cette marque n’a absolument aucun effet sur l’exécution ;
c’est uniquement un commentaire. L’exécution de {Max 3 5 C} lie C à 5. Comment
la procédure fonctionne-t-elle, exactement ? À l’appel de Max, X correspond à 3, Y à 5
et Z à la variable non liée référencée par C. Quand Max lie Z, alors cette variable sera
liée. Cette manière de passer les paramètres s’appelle le passage par référence. Nous
utilisons surtout l’appel par référence, à la fois pour les variables dataflow et pour les
variables affectables. La section 5.4.3 explique d’autres mécanismes de passage de
paramètres.
Les procédures avec des références externes
Examinons le corps de Max. C’est une instruction if :
if X>=Y then Z=X else Z=Y end
Cette instruction ne peut pas être exécutée car elle ne définit pas les identificateurs X, Y
et Z ! Ces identificateurs non définis s’appellent des identificateurs libres. (Parfois on
les appelle des variables libres, mais strictement parlant ils ne sont pas des variables.)
Si on met l’instruction if à l’intérieur de la procédure Max, elle pourra être exécutée parce que tous les identificateurs libres seront déclarés comme arguments de la
procédure.
Que se passe-t-il si on définit une procédure qui déclare seulement une partie des
identificateurs libres comme arguments ? Par exemple, définissons la procédure LB
avec le même corps que Max, mais seulement deux arguments :
proc {LB X ?Z}
if X>=Y then Z=X else Z=Y end
end
Que fait cette procédure ? Apparemment, elle prend un nombre X et lie Z à X si X>=Y,
et à Y sinon. En fait, Z aura toujours une valeur au moins Y. Mais quelle est la valeur
de Y ? Elle n’est pas un argument de la procédure. Il faut regarder la valeur de Y au
moment où la procédure est définie. Ce comportement est une conséquence de la
portée statique. Si Y=9 quand on définit la procédure, l’exécution de {LB 3 Z} liera
Z à 9. Regardons le fragment suivant :
© Dunod – La photocopie non autorisée est un délit
i
i
i
i
i
i
i
i
2.4 La sémantique du langage noyau
57
Les procédures
Les procédures sont un des plus importants éléments primitifs du langage. Nous
donnons un exemple simple qui montre comment définir et appeler une procédure.
Voici une procédure Max qui lie Z au maximum de X et Y :
proc {Max X Y ?Z}
if X>=Y then Z=X else Z=Y end
end
Pour faciliter la lecture de cette définition, nous marquons l’argument de sortie avec un
point d’interrogation « ? ». Cette marque n’a absolument aucun effet sur l’exécution ;
c’est uniquement un commentaire. L’exécution de {Max 3 5 C} lie C à 5. Comment
la procédure fonctionne-t-elle, exactement ? À l’appel de Max, X correspond à 3, Y à 5
et Z à la variable non liée référencée par C. Quand Max lie Z, alors cette variable sera
liée. Cette manière de passer les paramètres s’appelle le passage par référence. Nous
utilisons surtout l’appel par référence, à la fois pour les variables dataflow et pour les
variables affectables. La section 5.4.3 explique d’autres mécanismes de passage de
paramètres.
Les procédures avec des références externes
Examinons le corps de Max. C’est une instruction if :
if X>=Y then Z=X else Z=Y end
Cette instruction ne peut pas être exécutée car elle ne définit pas les identificateurs X, Y
et Z ! Ces identificateurs non définis s’appellent des identificateurs libres. (Parfois on
les appelle des variables libres, mais strictement parlant ils ne sont pas des variables.)
Si on met l’instruction if à l’intérieur de la procédure Max, elle pourra être exécutée parce que tous les identificateurs libres seront déclarés comme arguments de la
procédure.
Que se passe-t-il si on définit une procédure qui déclare seulement une partie des
identificateurs libres comme arguments ? Par exemple, définissons la procédure LB
avec le même corps que Max, mais seulement deux arguments :
proc {LB X ?Z}
if X>=Y then Z=X else Z=Y end
end
Que fait cette procédure ? Apparemment, elle prend un nombre X et lie Z à X si X>=Y,
et à Y sinon. En fait, Z aura toujours une valeur au moins Y. Mais quelle est la valeur
de Y ? Elle n’est pas un argument de la procédure. Il faut regarder la valeur de Y au
moment où la procédure est définie. Ce comportement est une conséquence de la
portée statique. Si Y=9 quand on définit la procédure, l’exécution de {LB 3 Z} liera
Z à 9. Regardons le fragment suivant :
© Dunod – La photocopie non autorisée est un délit
