Skip to main content

Les macroexpensions

Rappels sur l'évaluation et l'application

Evaluation application (eval o env)\texttt{(eval o env)}

Cette forme d'évaluation est utilisée pour toutes les fonctions construites avec des lambdalambda, definedefine, letlet et letrecletrec. C'est celle qui est mise en oeuvre dans la plupart des langages de programmation, en particulier impératifs (C,Java)(C,Java). Soit envenv l'environnement courant

  • Si l'objet oo est autoévaluant, renvoyer oo
  • Si oo est un symbole, alors
    • Rechercher une liaison définissant oo dans envenv, renvoyer la référence associée
  • Si oo est une liste
    • Calculer (eval (car o) env)\texttt{(eval (car o) env)}. Soit ff la fermeture résultat
    • Calculer (eval a env)\texttt{(eval a env)}, pour tout élément aa de (cdr o)\texttt{(cdr o)}. soit vv la liste des résultats
  • Calculer (apply f v)\texttt{(apply f v)}

Application : (apply f v)\texttt{(apply f v)}

Avec

  • ff : fermeture de la fonction à appliquer
  • vv : liste des valeurs des arguments
  1. Soient ee l'environnement lexical de ff, IfIf la liste des paramètres formels et cc le corps de la fermeture
  2. Construire l'environnement local elocale-local constitué des liaisons entre les paramètres formels de IfIf et les références des valeurs correspondantes dans vv
  3. Pour la suite d'expressions exprexpr du corps cc de ff faire (eval expr (cons e-local e))\texttt{(eval expr (cons e-local e))}
  4. Renvoyer le résultat de l'évaluation de la dernière expression de cc

É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).

(define-syntax-rule <pattern> <template>)\texttt{(define-syntax-rule <pattern> <template>)}

  • <pattern><pattern> : \texttt{(<nom>-<macro> <p_1> ...)}
  • <p1><p_1> : variables de la macro
  • <template><template> : expressions
  • Replacement des variables dans le template
  • Le résultat est une forme
  • Évaluation de la forme dans l'environnement d'appel