Bonjour,
Je rencontre quelques problèmes dans la définition d'une macro imbriquée. Je précise qu'il s'agit d'une imbrication un peu compliquée: la macro 1 définit la macro 2 et 3, et la macro 3 est définie à l'aide de la macro 2. Comme tout cela est un peu abstrait, voilà mon code:
Mon problème est le suivant: à l'issue de chacune des deux macros "internes", je souhaite retourner le body en argument recalculé (respectivement nbody et tr) sans rajouter de parenthèses.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 (defmacro declare-monad (name alis) ;; macro 1, ex: (declare-monad parser ((>>= . parser>>=) (return . parser-return))) (let* ((str-name (symbol-name name)) ;; "parser" (mac-name (intern (concatenate 'string "WITH-" str-name "-MONAD"))) ;; with-parser-monad (red-name (intern (concatenate 'string str-name "-REDUCE")))) ;; parser-reduce `(progn (defmacro ,mac-name (&body body) ;; ex: (with-parser-monad (return #\a)) => (parser-return #\a) (let ((nbody (sublis ',alis body))) ;; substitution `(values ,@nbody))) ;; :-( (,mac-name ;; with-parser-monad : on définit donc la troisème macro dans le contexte de la deuxième. (defmacro ,red-name (&rest mfncalls) (let ((tr (reduce (lambda (l r) (list ' >>= l r)) mfncalls))) ;; du coup >>= est remplacé par parser>>= `(values ,tr))))))) ;; :-(
Or
Code : Sélectionner tout - Visualiser dans une fenêtre à part `(,@nbody) ;; rajoute des parenthèsess
Code : Sélectionner tout - Visualiser dans une fenêtre à part `,@nbody ;; interdit
Code : Sélectionner tout - Visualiser dans une fenêtre à part ,@nbody ;; s'interprète dans le contexte de la première backquote => undeclared free variable nbodyComme solution je n'ai trouvé que:
Code : Sélectionner tout - Visualiser dans une fenêtre à part ',@body ;; idem => undeclare free variable nbdody
mais c'est tellement moche que je pense que qqc m'échappe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part `(values ,@nbody)
Des idées?
Merci d'avance
Partager