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.