En LISP, a été réalisé
par groupe de 3 personnes un gros projet (de début Novembre à
fin Janvier). Il consistait en la réalisation de:
-
Un métaévaluateur LISP (programme écrit
en LISP qui évalue du code LISP passé en paramètre)
-
Un compilateur de LISP vers un langage que nous avons défini (proche
de l'assembleur 8086)
-
La machine virtuelle correspondant à ce langage
-
Des utilitaires de fonctions sur les automates et expressions régulières
Moi, je me suis occuppé du métaévaluateur LISP (puisque
je m'étais déjà penché 2 ans plus tôt
sur un évaluateur SCHEME, je savais à quel genre de problèmes
m'attendre). Le métaévaluateur a été très
bien réussi, puisque bien au delà de métaévaluer
quelques lignes de LISP, il réussissait à évaluer
le code du compilateur ainsi que celui de la machine virtuelle (qui contenaient
donc bien des formes LISP particulières qui étaient toutes
gérées), et même à s'évaluer lui-même.
Conformément à la théorie, le temps de calcul croît
exponentiellement en fonction du nombre de métaévaluateurs
imbriqués. Le seul défaut de ce métaévaluateur
(par manque de temps) est qu'il ne gère pas les fonctions locales
(il ne gère que les variables locales). En effet, lorsqu'une fonction
locale est définie et appellée, il faudrait lui passer un
environnement contenant la liste des fonctions locales. Or, une fonction
locale peut très bien être récursive et l'environnement
local devrait donc contenir la fonction locale en question (avec son propre
environnement). En résultat, nous sommes amenés à
utiliser des listes circulaires, dont l'affichage n'est pas géré
par CLISP (et comme j'affichais plein de variables afin de voir si tout
marchait correctement... ça ne me tentait pas trop de continuer
à travailler à l'aveugle, vu le peu de temps qu'il restait...).
Si quelqu'un veut se pencher sur le problème et parfaire ce métaévaluateur
LISP, je fournis ci-dessous le code (qui a été testé
et marche sous CLISP 95 et CLISP 97), que vous pouvez modifier comme bon
vous semble à la seule condition de ne pas effacer mon nom.
Le compilateur est l'oeuvre de Gauthier HADERER. Lui aussi était
très bien intégré dans le projet, puisqu'il arrivait
à se compiler lui-même et à compiler le métaévaluateur,
et ces programmes étaient correctement évalués par
la machine virtuelle.
La machine virtuelle est l'oeuvre de Eric BOULAT. Hélas, il n'a
pas travaillé comme Gauthier et moi, et en résultat, la machine
virtuelle n'arrivait pas à évaluer son propre code (à
part ça, toutes les parties du projet pouvaient s'imbriquer entre
elles dans n'importe quel ordre et à plusieurs niveaux). Ce problème
vient du fait que les variables d'environnement de la machine virtuelle
sont globales (alors que pour Gauthier et moi, nous les passions en paramètres,
ce qui permettaient d'avoir lorsqu'on réappellait notre propre programme,
de nouvelles variables d'environnement qui n'écrasaient pas les
variables d'environnement courantes).
Les utilitaires pour les automates et expressions régulières
sont l'oeuvre de Gauthier HADERER.
Mon métaévaluateur a obtenu la meilleure note de toute
la promotion: 18/20. Les compilateur, machine virtuelle et automates obtinrent
aussi les meilleurs notes dans leurs catégories (18, 17 et 17 respectivement).
Tout l'intérêt de ce projet passionant fut que le programme
de chacun pouvait prouver que les programmes des autres fonctionnaient
correctement :o)
code du projet (archive RAR)