“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 65 — #75
i
i
i
i
i
i
i
i
2.4 La sémantique du langage noyau
65
Voici un fragment de programme avec des occurrences libres et liées :
local Arg1 Arg2 in
Arg1=111 * 111
Arg2=999 * 999
Res=Arg1+Arg2
end
Dans cette instruction, tous les identificateurs sont déclarés avec la portée lexicale.
Toutes les occurrences des identificateurs Arg1 et Arg2 sont liées et l’unique occurrence de Res est libre. Cette instruction ne peut pas s’exécuter. Pour la rendre exécutable, elle doit faire partie d’une instruction plus grande qui déclare Res. Voici une
instruction qui peut s’exécuter :
local Res in
local Arg1 Arg2 in
Arg1=111 * 111
Arg2=999 * 999
Res=Arg1+Arg2
end
{Browse Res}
end
Cette instruction peut s’exécuter parce qu’elle ne contient pas d’occurrences libres. (La
seule occurrence libre, Browse, est définie dans l’environnement global de l’interface
interactive.)
Les valeurs procédurales (fermetures)
Regardons comment construire une valeur procédurale en mémoire. Ce n’est pas
aussi simple que l’on pourrait imaginer parce que les procédures peuvent avoir des
références externes. Par exemple :
proc {LowerBound X ?Z}
if X>=Y then Z=X else Z=Y end
end
Dans cet exemple, l’instruction if a trois identificateurs libres, X, Y et Z. Deux d’entre
eux, X et Z, sont aussi des arguments formels de LowerBound. Le troisième, Y,
n’est pas un paramètre formel. Il doit être déclaré dans l’environnement dans lequel la
procédure elle-même est déclarée. La valeur procédurale de LowerBound doit avoir
une référence pour Y. Sinon, nous ne pourrions pas appeler la procédure parce que Y
serait une sorte de pointeur détaché.
Regardons ce qui se passe dans le cas général. Une expression peut créer une valeur
procédurale :
proc { $ y 1 · · · ·y n } s end
© 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
65
Voici un fragment de programme avec des occurrences libres et liées :
local Arg1 Arg2 in
Arg1=111 * 111
Arg2=999 * 999
Res=Arg1+Arg2
end
Dans cette instruction, tous les identificateurs sont déclarés avec la portée lexicale.
Toutes les occurrences des identificateurs Arg1 et Arg2 sont liées et l’unique occurrence de Res est libre. Cette instruction ne peut pas s’exécuter. Pour la rendre exécutable, elle doit faire partie d’une instruction plus grande qui déclare Res. Voici une
instruction qui peut s’exécuter :
local Res in
local Arg1 Arg2 in
Arg1=111 * 111
Arg2=999 * 999
Res=Arg1+Arg2
end
{Browse Res}
end
Cette instruction peut s’exécuter parce qu’elle ne contient pas d’occurrences libres. (La
seule occurrence libre, Browse, est définie dans l’environnement global de l’interface
interactive.)
Les valeurs procédurales (fermetures)
Regardons comment construire une valeur procédurale en mémoire. Ce n’est pas
aussi simple que l’on pourrait imaginer parce que les procédures peuvent avoir des
références externes. Par exemple :
proc {LowerBound X ?Z}
if X>=Y then Z=X else Z=Y end
end
Dans cet exemple, l’instruction if a trois identificateurs libres, X, Y et Z. Deux d’entre
eux, X et Z, sont aussi des arguments formels de LowerBound. Le troisième, Y,
n’est pas un paramètre formel. Il doit être déclaré dans l’environnement dans lequel la
procédure elle-même est déclarée. La valeur procédurale de LowerBound doit avoir
une référence pour Y. Sinon, nous ne pourrions pas appeler la procédure parce que Y
serait une sorte de pointeur détaché.
Regardons ce qui se passe dans le cas général. Une expression peut créer une valeur
procédurale :
proc { $ y 1 · · · ·y n } s end
© Dunod – La photocopie non autorisée est un délit
