Un sujet qui n'a pas encore été abordé concerne le contexte dans lequel on évalue une référence à un texte. La réponse n'est pas forcément simple. En effet, une référence évaluée enrichit le contexte d'évaluation : faut-il alors évaluer cette référence dans le contexte enrichi, ou faut-il évaluer la référence dans le contexte dans le contexte initial puis enrichir le contexte ?
Référence à évaluer :
![]()
Référence évaluée = nouveau contexte :
![]()
Le fait que l'environnement s'évalue en partie sur lui-même permet d'observer un comportement qui s'apparente assez bien au polymorphisme – l'usage d'un traitement sur des objets différents conduit à utiliser des définitions de ce traitement différentes.
En effet on pourra dans un environnement utiliser une première référence pour caractériser l'objet, et une deuxième pour se référer au traitement, traitement qui sera alors celui défini pour l'objet référencé.
Par exemple :
def declVARentiere
def decla = "VAR" (nom) ":integer;"
def incr = (nom) ":=" (nom) "+1;"
def declVARarbre
def decla = "VAR" (nom) ":arbre;"
def incr = (nom) ":=" (nom) "@." (chppteur) ";"
declVARentiere : sert à déclarer une variable entière, et la propriété incr.
declVARarbre : sert à déclarer une variable arbre (liste chaînée), et la propriété incr.
def varE
def nom = "E"
(ref declVARentiere)
def varA
def nom = "A"
def chppteur = "suiv"
(ref declVARarbre)
varE : déclare une variable entière de nom "E", de type "integer".
varA : déclare une variable arbre de nom "A", de type "arbre", dont le champ pointeur s'appelle "suiv".
def txt
= (use incr (ref var))
txt : utilise la propriété incr de l'objet var qui joue ici le rôle d'un paramètre. C'est à ce niveau-ci qu'on observe un comportement polymorphe de l'utilisation du texte incr :
|
donne |
|
|
donne |
|
txtE : utilise txt en définissant var comme étant varE.
txtA : utilise txt en définissant var comme étant varA.