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.