9.2. Détermination de l'appartenance à une liste

Si nous reprenons l'exemple de l'interpréteur LOGO, nous avons dit qu'un programme LOGO était stocké sous forme de liste. Avec un tel programme LOGO contenant une constante de type "liste", cette constante apparaîtra, dans la liste constituant le programme, comme une sous-liste.

Exemple :

REPEAT 4 [PRINT "HELLO]

peut être représenté de la manière suivante

Fig.9.1. Représentation d'instructions LOGO sous forme de listes

L'interpréteur LOGO gère, pour l'exécution du programme, une pile d'objets sur laquelle il met les paramètres des procédures et des instructions qu'il est en train d'interpréter (on peut considérer les instructions du langage comme des procédures prédéfinies). La syntaxe du LOGO est telle qu'il n'est pas possible, à l'intérieur d'une procé dure, de modifier les arguments qui lui sont passés en paramètre. Il est donc plus efficace de fournir aux procédures l'adresse des objets qui leurs sont passés en paramètres plutôt qu'une copie de ces objets. La pile de l'interpréteur est donc organisée comme une pile de pointeurs plutôt que comme une pile d'objets.

Il n'y aurait pas de problème si les procédures ne recevaient comme paramètres que des constantes ou des variables simples (auquel cas il n'y aurait rien à détruire). Les choses se compliquent du fait que les paramètres spécifiés dans l'appel à une procédure peuvent être des expressions. Les résultats de ces expressions sont calculés à l'exécution, lors de l'activation de la procédure et constituent donc des objets qui devront être détruits lors de la terminaison de la procédure (contrairement aux autres objets passés en paramètre).

Exemple :

REPEAT SUM 2 2 [PRINT "HELLO]

peut être représenté de la manière suivante :

Fig. 9.2. Illustration de la pile d'activation utilisée par l'interprète.

L'illustration ci-dessus montre l'état des données de l'interpréteur lors de l'activation de l'instruction REPEAT. Nous voyons donc que, lorsque l'instruction REPEAT sera terminée, les divers éléments de la pile d'activation ne devront pas tous subir le même traitement. La sous-liste [PRINT "HELLO] ne devra pas être détruite alors que l'objet "4" devra être éliminé.

Si l'on regarde la déclaration du type "Objet", on remarque que le champ "Suivant" n'est utilisé que si l'objet en question fait partie d'une liste. Nous pouvons donc utiliser ce champ pour indiquer que l'objet ne fait pas partie d'une liste. Il nous faut donc une autre valeur que la constante prédéfinie "nil" qui se distingue des valeurs légales de pointeurs. La solution consiste à déclarer une variable :

var Sentinelle: VersObjet;

qui sera initialisée au début de l'exécution de l'interpréteur. L'objet pointé par cette variable ne sera jamais utilisé, mais son adresse servira de constante permettant de distinguer les objets "destructibles" des autres. Autrement dit, tout objet dont le pointeur Suivant a la même valeur que le pointeur Sentinelle est considéré comme pouvant être détruit.

9.3. Partage d'élément entre listes

Table des matières.

Site Hosting: Bronco