<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
There is an old saying: if you are using "eval", you are<br>
doing it wrong.  So far I have yet to find any significant<br>
exceptions to this rule.<br>
<br>
I do not see what the eval is for.  Just get rid of it<br>
and have the definition of define-struct-getter<br>
expand into the defmacro of the concatenated<br>
name.<br>
<br>
Meanwhile, there are several problems here.<br>
<br>
(1) In define-struct-getter, are the slots intended<br>
to be symbols, or forms that evaluate to symbols?<br>
If they are symbols, intern fails.  If they are<br>
forms that are evaluated to symbols, symbol-name<br>
fails because it is called on the form.  I could<br>
not get any case to work.<br>
<br>
(2) In access-slot, you expand "object" twice,<br>
which can cause trouble if the form to which<br>
"object" is bound has side-effects.  It is normal<br>
good practice to use generated symbols here.<br>
<br>
(3) Package arguments are usually a pain in the<br>
neck.  Standard practice is to just use "intern"<br>
so that it's interned in the current package.<br>
<br>
-- Dan<br>
<br>
<br>
<br>
Yakov Zaytsev wrote:
<blockquote
 cite="mid:AANLkTikifj3VL_52S4vHZmP1EFG3Qs=rubuzcc42FGsx@mail.gmail.com"
 type="cite">My best macro so far ;-)
  <div><br>
  </div>
  <div>
  <div>(defmacro access-slot (object &rest slot-names)</div>
  <div>  `(ff:fslot-value-typed (ff:foreign-pointer-type ,object)</div>
  <div>                         :c (ff:foreign-pointer-address ,object)</div>
  <div>                         ,@slot-names))</div>
  <div><br>
  </div>
  <div>(defmacro define-struct-getter (struct package &rest slots)</div>
  <div>  (loop for s in slots</div>
  <div>     do (let ((acc (intern (concatenate 'string (symbol-name
struct) "-" (symbol-name s))))</div>
  <div>                   (sp (intern s package)))</div>
  <div>               (eval `(defmacro ,acc (object)</div>
  <div>                        `(access-slot ,object ',',sp))))))</div>
  <div><br>
  </div>
  <div>because it is a macro which writes macros which uses macro. My
first real world macro.</div>
  <br>
  <div class="gmail_quote">On Sun, Sep 5, 2010 at 4:24 PM, Kazimir
Majorinc <span dir="ltr"><<a moz-do-not-send="true"
 href="mailto:kazimir@chem.pmf.hr">kazimir@chem.pmf.hr</a>></span>
wrote:<br>
  <blockquote class="gmail_quote"
 style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">As
first, good luck with this list!<br>
    <br>
I'm in search for best examples of "code is data" paradigm in Common<br>
Lisp. For most CL-ers, it probably means "macros", but eval, backquote,<br>
anything that processes the code as data is of interest. As "best" I<br>
think on the most surprising, powerful, sophisticated examples, not<br>
necessarily of a pedagogical value.<br>
    <br>
Imagine that someone invited you to write the presentation "Five best CL<br>
macros ... I seen" or "Five best CL macros ... I wrote." What would you<br>
chose and why?<br>
    <br>
Kazimir Majorinc<br>
    <br>
    <br>
    <br>
    <br>
    <br>
_______________________________________________<br>
pro mailing list<br>
    <a moz-do-not-send="true" href="mailto:pro@common-lisp.net">pro@common-lisp.net</a><br>
    <a moz-do-not-send="true"
 href="http://common-lisp.net/cgi-bin/mailman/listinfo/pro"
 target="_blank">http://common-lisp.net/cgi-bin/mailman/listinfo/pro</a><br>
  </blockquote>
  </div>
  <br>
  </div>
  <pre wrap="">
<hr size="4" width="90%">
_______________________________________________
pro mailing list
<a class="moz-txt-link-abbreviated" href="mailto:pro@common-lisp.net">pro@common-lisp.net</a>
<a class="moz-txt-link-freetext" href="http://common-lisp.net/cgi-bin/mailman/listinfo/pro">http://common-lisp.net/cgi-bin/mailman/listinfo/pro</a>
  </pre>
</blockquote>
</body>
</html>