defmacro + captura (intencional)

4 views
Skip to first unread message

Rafael Ibraim

unread,
Nov 10, 2011, 5:07:39 AM11/10/11
to lis...@googlegroups.com
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
ibra...@gmail.com

Jonas Oliveira Rodrigues

unread,
Nov 10, 2011, 11:09:50 AM11/10/11
to lis...@googlegroups.com
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 <ibra...@gmail.com>
--
You received this message because you are subscribed to the Google Groups "Lisp-br" group.
To post to this group, send email to lis...@googlegroups.com.
To unsubscribe from this group, send email to lisp-br+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/lisp-br?hl=en.


Rafael Ibraim

unread,
Nov 10, 2011, 1:44:20 PM11/10/11
to lis...@googlegroups.com
Putz! Nem acredito em como não pensei nisso antes!

Valeu!

Em 10 de novembro de 2011 14:09, Jonas Oliveira Rodrigues
<jxo...@gmail.com> escreveu:

Reply all
Reply to author
Forward
0 new messages