La solution tient en deux points :
Note : évaluation des fonctions Lisp
L'appel d'une fonction : (f x1 x2 x3) s'évalue comme suit :
| 1- | on évalue, en parallèle, les arguments de la fonction f : x1, x2, x3, qui fournit les valeurs respectives : v1, v2, v3 ; |
| 2- | on applique la fonction f sur les arguments évalués : v1, v2, v3. |
Pour une F-expr, on n'évalue pas les arguments : f est alors appliquée sur les arguments non évalués : x1, x2, x3.
Une macro-définition est alors :
- placée à l'intérieur d'un texte Lisp lsp,
- préfixée par le nom d'une F-expr.
L'évaluation du texte Lisp lsp provoque l'évaluation, par l'évaluateur Lisp, de l'expression préfixée, laquelle permet le déroutement de l'évaluation vers le texte de définition de la F-expr nommée.
On n'a donc qu'une seule chose à faire pour la définition d'une macro-définition : écrire le texte de la F-expr associée – problème non simple mais clairement identifié. Pour ce faire, on garantit, à l'évaluation de la macro-définition – à l'appel de la F-expr – une unique information de contexte :
on a une variable Lisp ctx dont la valeur est précisément le « contexte d'évaluation » tel qu'il est défini précédemment.
Ceci signifie que dans le texte de la F-expr on pourra invoquer l'évaluation des textes, puisqu'on a la connaissance, "lispienne", du contexte d'évaluation des textes.
Par exemple (ce sont les opérateurs de la Syntaxe Complétée) :
macro-def : | |
| syntaxe | : (lst-init env rep) |
| sémantique | : env est un environnement composé d'environnements : pour chaque environnement, on évalue la représentation rep dans le contexte formé par cet environnement et le contexte reçu (variable : ctx). |
macro-def : | |
| syntaxe | : (lst rep) |
| sémantique | : lst doit s'évaluer "à l'intérieur" d'une évaluation de lst-init : pour chaque environnement restant, on évalue la représentation rep dans le contexte construit comme il l'est avec lst-init. |
macro-def : | |
| syntaxe | : (tst (cond1 rep) ... (condN rep)) |
| sémantique | : cond1 ... condN sont des nombres.tst évalue la représentation rep associée à condK s'il reste exactement condK environnements dans la liste des environnements. |