“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 58 — #68
i
i
i
i
i
i
i
i
58
2
• La programmation déclarative
local Y LB in
Y=10
proc {LB X ?Z}
if X>=Y then Z=X else Z=Y end
end
local Y=15 Z in
{LB 5 Z}
end
end
Quand on fait l’appel {LB 5 Z}, à quoi Z sera-t-elle liée ? Elle sera liée à 10. Le lien
Y=15 à l’appel de LB est ignoré : c’est le lien Y=10 visible dans la définition qui est
important.
La portée dynamique versus la portée statique
Regardons le fragment suivant :
local P Q in
proc {Q X} {Browse stat(X)} end
proc {P X} {Q X} end
local Q in
proc {Q X} {Browse dyn(X)} end
{P hello}
end
end
Est-ce qu’il affiche stat(hello) ou dyn(hello) ? La portée statique dit qu’il
affiche stat(hello). En d’autres termes, P utilise la version de Q qui existe à la
définition de P. Mais il y a une autre possibilité : P pourrait utiliser la version de Q qui
existe à l’appel de P. Cette possibilité s’appelle la portée dynamique.
Les deux formes, la portée statique et la portée dynamique, ont été utilisées comme
le défaut dans les langages de programmation. Pour les comparer, mettons d’abord
leurs définitions côte à côte :
– La portée statique. La variable qui correspond à une occurrence d’un identificateur est celle définie dans la déclaration qui contient l’occurrence et qui est la
plus proche de l’occurrence dans le texte du programme.
– La portée dynamique. La variable qui correspond à une occurrence d’un identificateur est celle définie dans la déclaration qui contient l’occurrence et qui est
la plus récente pendant l’exécution qui mène jusqu’à l’instruction qui contient
l’occurrence.
À l’origine, le langage Lisp avait une portée dynamique. Les langages Common Lisp et
Scheme, qui sont des descendants de Lisp, ont une portée statique par défaut. Common
i
i
i
i
i
i
i
i
58
2
• La programmation déclarative
local Y LB in
Y=10
proc {LB X ?Z}
if X>=Y then Z=X else Z=Y end
end
local Y=15 Z in
{LB 5 Z}
end
end
Quand on fait l’appel {LB 5 Z}, à quoi Z sera-t-elle liée ? Elle sera liée à 10. Le lien
Y=15 à l’appel de LB est ignoré : c’est le lien Y=10 visible dans la définition qui est
important.
La portée dynamique versus la portée statique
Regardons le fragment suivant :
local P Q in
proc {Q X} {Browse stat(X)} end
proc {P X} {Q X} end
local Q in
proc {Q X} {Browse dyn(X)} end
{P hello}
end
end
Est-ce qu’il affiche stat(hello) ou dyn(hello) ? La portée statique dit qu’il
affiche stat(hello). En d’autres termes, P utilise la version de Q qui existe à la
définition de P. Mais il y a une autre possibilité : P pourrait utiliser la version de Q qui
existe à l’appel de P. Cette possibilité s’appelle la portée dynamique.
Les deux formes, la portée statique et la portée dynamique, ont été utilisées comme
le défaut dans les langages de programmation. Pour les comparer, mettons d’abord
leurs définitions côte à côte :
– La portée statique. La variable qui correspond à une occurrence d’un identificateur est celle définie dans la déclaration qui contient l’occurrence et qui est la
plus proche de l’occurrence dans le texte du programme.
– La portée dynamique. La variable qui correspond à une occurrence d’un identificateur est celle définie dans la déclaration qui contient l’occurrence et qui est
la plus récente pendant l’exécution qui mène jusqu’à l’instruction qui contient
l’occurrence.
À l’origine, le langage Lisp avait une portée dynamique. Les langages Common Lisp et
Scheme, qui sont des descendants de Lisp, ont une portée statique par défaut. Common
