Olá!

exporte também o símbolo "magic-number", ou no defpackage:

 (defpackage :foo
    (:use :common-lisp)
    (:export :deffoo magic-number))

ou solto no código mesmo:

(export 'magic-number)

(defmacro deffoo (&rest body)
 `(let ((magic-number 42)) ;; <---- Captura INTENCIONAL!
    ,@body))

[]'s


2011/11/10 Rafael Ibraim <[email protected]>

> Pessoal, estou uma pequena dúvida, por favor dêem uma olhada no exemplo
> abaixo:
>
>  ;;; Macro na package FOO
>  (defpackage :foo
>  (:use :common-lisp)
>  (:export :deffoo))
>
>  (in-package :foo)
>
>  (defmacro deffoo (&rest body)
>  `(let ((magic-number 42)) ;; <---- Captura INTENCIONAL!
>     ,@body))
>
>  E agora, ao usar a macro na package BAR....
>  (defpackage :bar
>  (:use common-lisp :foo))
>
>  (deffoo
>  (+ magic-number 1)) ;; <---- Erro: MAGIC-NUMBER não existe!
>
>  A expansão(macroexpand-1) de deffoo na verdade é:
>  (LET ((FOO::MAGIC-NUMBER 42))
>       (+ MAGIC-NUMBER 1))
>
>  Claramente, são símbolos em packages diferentes e é isso que gera o erro.
>  Minha dúvida é: qual é a melhor maneira de se resolver este tipo de
> situação?
>  Atualmente eu altero minha macro para:
>
>  (defmacro deffoo (&rest body)
>  `(let (((intern (symbol-name 'magic-number)) 42))
>     ,@body))
>
>  E tudo funciona perfeitamente, mas acredito que exista uma solução
>  mais prática. Alguém tem alguma idéia?
>
> --
> Rafael Ibraim
> Oracle Database SQL Expert
> Linux User Number: #537480
> [email protected]
>
> --
> You received this message because you are subscribed to the Google Groups
> "Lisp-br" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/lisp-br?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Lisp-br" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/lisp-br?hl=en.

Responder a