[Openmcl-devel] expanding macros

rm at tuxteam.de rm at tuxteam.de
Sat Dec 11 12:25:19 PST 2010


On Sat, Dec 11, 2010 at 07:03:07PM +0100, Taoufik Dachraoui wrote:
> Hi
> 
> I had a bug in my compiler generator and found it difficult to trace the
> root of the error
> I could not find something like macroexpand-1 but expands all macros

You mean like macroexpand-all ?


> I wrote the following macro to do that and would like to share it (any
> comments are welcome)
> 
> ? (defun expand-macros (code macros)
>   (labels ((%expand-macros (code)
>    (cond
>     ((null code) nil)
>     ((atom code) code)
>     ((member (car code) macros)
>      (%expand-macros (macroexpand-1 code)))
>     (t
>      (loop for c in code
>    collect (%expand-macros c))))))
>     (pprint (%expand-macros (macroexpand-1 code)))))
> EXPAND-MACROS

But this definition doesn't match your own description.
And the third cond expression seems to be buggy: a macro call in the
macro's arguments doesn't get expanded.


 Cheers, Ralf Mattes

> ? (expand-macros '(gen-guido-compiler) '(destructuring-match-specials
> cond-match-specials))
> 
> (DEFUN COMPILE/0 (EXPR &OPTIONAL (GENV (MAKE-HASH-TABLE)))
>   (DELCARE (SPECIAL X) (SPECIAL L))
>   (LET ((#:G28589
>          (BLOCK NIL
>            (LET* ((#:G28590 EXPR)
>                   (N
>                    (IF (AND (ATOM #:G28590)
>                             (TYPEP #:G28590 '(UNSIGNED-BYTE 32)))
>                        #:G28590
>                        (RETURN-FROM NIL NIL))))
>              (DECLARE (SPECIAL N))
>              (PROGN (EMIT 17 *OPCODE-SIZE*) (EMIT N *WORD-SIZE*))))))
>     (IF (NOT (NULL #:G28589))
>         (PROGN (FORMAT T
>                        "expression ~A matched ~A~%"
>                        EXPR
>                        '(:TYPE N '(UNSIGNED-BYTE 32)))
>                #:G28589)
>         (LET ((#:G28589
>                (LET ((#:G28591
>                       (BLOCK NIL
>                         (LET* ((#:G28592 EXPR)
>                                (X
>                                 (IF (AND (ATOM #:G28592)
>                                          (TYPEP #:G28592 'SYMBOL))
>                                     #:G28592
>                                     (RETURN-FROM NIL NIL))))
>                           (DECLARE (SPECIAL X))
>                           (PROGN (EMIT 8 *OPCODE-SIZE*)
>                                  (EMIT (IFNULL. (CAR (GETHASH X GENV)) 0)
>                                        *WORD-SIZE*)
>                                  (EMIT 0 *WORD-SIZE*)
>                                  (EMIT 19 *OPCODE-SIZE*))))))
>  ........
> 
> Kind regatds
> Taoufik

> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel




More information about the Openmcl-devel mailing list