There is an old saying: if you are using "eval", you are doing it wrong. So far I have yet to find any significant exceptions to this rule.
I do not see what the eval is for. Just get rid of it and have the definition of define-struct-getter expand into the defmacro of the concatenated name.
Meanwhile, there are several problems here.
(1) In define-struct-getter, are the slots intended to be symbols, or forms that evaluate to symbols? If they are symbols, intern fails. If they are forms that are evaluated to symbols, symbol-name fails because it is called on the form. I could not get any case to work.
(2) In access-slot, you expand "object" twice, which can cause trouble if the form to which "object" is bound has side-effects. It is normal good practice to use generated symbols here.
(3) Package arguments are usually a pain in the neck. Standard practice is to just use "intern" so that it's interned in the current package.
-- Dan
Yakov Zaytsev wrote:
My best macro so far ;-)
(defmacro access-slot (object &rest slot-names) `(ff:fslot-value-typed (ff:foreign-pointer-type ,object) :c (ff:foreign-pointer-address ,object) ,@slot-names))
(defmacro define-struct-getter (struct package &rest slots) (loop for s in slots do (let ((acc (intern (concatenate 'string (symbol-name struct) "-" (symbol-name s)))) (sp (intern s package))) (eval `(defmacro ,acc (object) `(access-slot ,object ',',sp))))))
because it is a macro which writes macros which uses macro. My first real world macro.
On Sun, Sep 5, 2010 at 4:24 PM, Kazimir Majorinc <kazimir@chem.pmf.hr mailto:kazimir@chem.pmf.hr> wrote:
As first, good luck with this list! I'm in search for best examples of "code is data" paradigm in Common Lisp. For most CL-ers, it probably means "macros", but eval, backquote, anything that processes the code as data is of interest. As "best" I think on the most surprising, powerful, sophisticated examples, not necessarily of a pedagogical value. Imagine that someone invited you to write the presentation "Five best CL macros ... I seen" or "Five best CL macros ... I wrote." What would you chose and why? Kazimir Majorinc _______________________________________________ pro mailing list pro@common-lisp.net <mailto:pro@common-lisp.net> http://common-lisp.net/cgi-bin/mailman/listinfo/pro
pro mailing list pro@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/pro