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.

Responder a