Les macroexpensions
Rappels sur l'évaluation et l'application
Evaluation application
Cette forme d'évaluation est utilisée pour toutes les fonctions construites avec des , , et . C'est celle qui est mise en oeuvre dans la plupart des langages de programmation, en particulier impératifs . Soit l'environnement courant
- Si l'objet est autoévaluant, renvoyer
- Si est un symbole, alors
- Rechercher une liaison définissant dans , renvoyer la référence associée
- Si est une liste
- Calculer . Soit la fermeture résultat
- Calculer , pour tout élément de . soit la liste des résultats
- Calculer
Application :
Avec
- : fermeture de la fonction à appliquer
- : liste des valeurs des arguments
- Soient l'environnement lexical de , la liste des paramètres formels et le corps de la fermeture
- Construire l'environnement local constitué des liaisons entre les paramètres formels de et les références des valeurs correspondantes dans
- Pour la suite d'expressions du corps de faire
- Renvoyer le résultat de l'évaluation de la dernière expression de
Évaluation paresseuse
L'évaluation paresseuse ou par nécessité consiste à retarder l'évaluation des paramètres jusqu'au moment de leur utilisation. Éventuellement, certains paramètres ne sont pas évalués dans certains cas. Ce mécanisme est nécessaire pour implémenter les conditionnelles et dans les boucles
Replacement textuel
Il y a deux niveau de substitutions l'appel d'une macro est substitué par la définition de la macro dans laquelle les paramètres formels ont été substitués par les arguments donnés lors de l'appel. Toutes ces substitutions sont textuelles. Ainsi, la structure syntaxique n'est pas prise en compte. En C, les macro-fonction fonctionnent de cette façon. Pour éviter certains pièges syntaxiques, il faut respecter des règles d'écriture des macros (paramètre entre parenthèses, corps entre parenthèses)
Macroexpensions par transformation de source
En lisp et en scheme, les macroexpensions fonctionnent par transformation de source, en tenant compte de la syntaxe. Elles permettent d'écrire ces formes dites spéciales dont l'évaluation n'est pas applicative. Les arguments sont évalués sur demande (en lisp) ou par nécessité (en scheme).
- : \texttt{(<nom>-<macro> <p_1> ...)}
- : variables de la macro
- : expressions
- Replacement des variables dans le template
- Le résultat est une forme
- Évaluation de la forme dans l'environnement d'appel