<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>Am 07.03.2010 um 17:27 schrieb Ron Garret:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">I don't see any reason to make this a macro instead of a function.</div></blockquote><div><br></div>Right.</div><div><br></div><div>Also the macro has a few problems:</div><div><br></div><div>* points will be evaluated more than once</div><div><br></div><div>* variables i and npoints are introduced. That can be a problem. Example:</div><div><br></div><div><br></div><div>(loop for i from 10 upto 20</div><div>  (x/fillpolygon (mypoints foo i)))</div><div><br></div><div>The first use of points is okay.</div><div><br></div><div>(let ((i 0) (npoints (length (mypoints foo i))))</div><div>  ...</div><div><br></div><div>but the second shows the problem</div><div><br></div><div>  (dolist (p (mypoints foo i))</div><div><br></div><div>    ....))</div><div><br></div><div><div>But that's the 'i' of the LET, which is always iterating from 0.</div></div><div><br></div><div>Or try to expand this:</div><div><br></div><div>(x/fillpolygon xpoints)</div><div><br></div><div><br></div><div>Macros should not introduce these kinds of variables and there are several variables introduced in the macro - not only the one from the LET. One needs to create symbols that do not clash with application symbols. Otherwise one can create bugs that are extremely hard to find.</div><div><br></div><div>But best listen to Ron and implement it as a function. Remember, one can also declare a function to be inlined.</div><div><br></div><div>Regards,</div><div><br></div><div>Rainer Joswig</div><div><br></div><div><br></div><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div>rg</div><div><br><div><div>On Mar 7, 2010, at 2:42 AM, Taoufik Dachraoui wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">I found what is wrong in the code to fill a polygon, actually I had many errors in the code and I corrected it as follows:<div><br></div><div><div>(defmacro x/fillpolygon (points &key (shape #$Complex) (mode #$CoordModeOrigin))</div>
<div>"points is a list of pairs, shape is one of Complex, Convex,  or Nonconvex, and</div><div>mode is one of CoordModeOrigin or CoordModePrevious."</div><div>    `(let ((i 0) (npoints (length ,points)))</div><div>
       (ccl::%stack-block ((xpoints (* (ccl::foreign-size :<XP>oint :bytes)</div><div><span class="Apple-tab-span" style="white-space:pre">                             </span>       (1+ npoints))))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span> (dolist (p ,points)</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>   (rlet ((xpoint :<XP>oint))</div><div><span class="Apple-tab-span" style="white-space:pre">             </span> (setf (pref xpoint :<XP>oint.x) (car p))</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span> (setf (pref xpoint :<XP>oint.y) (cadr p))</div><div><span class="Apple-tab-span" style="white-space:pre">             </span> (setf (paref xpoints (:* :<XP>oint) i) xpoint)</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span> (incf i)))</div><div><span class="Apple-tab-span" style="white-space:pre">  </span> (#_XFillPolygon *display* </div><div><span class="Apple-tab-span" style="white-space:pre">                     </span> (window *context*)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                      </span> (graphics-context *context*)</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span> xpoints</div><div><span class="Apple-tab-span" style="white-space:pre">                     </span> npoints</div>
<div><span class="Apple-tab-span" style="white-space:pre">                      </span> ,shape</div><div><span class="Apple-tab-span" style="white-space:pre">                      </span> ,mode</div><div><span class="Apple-tab-span" style="white-space:pre">                       </span> ))))</div>
<div><br></div><div><br></div><div>Kind regards</div><div>Taoufik</div><br><div class="gmail_quote">On Sun, Mar 7, 2010 at 9:50 AM, Taoufik Dachraoui <span dir="ltr"><<a href="mailto:taoufik@mazeboard.com">taoufik@mazeboard.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto; "><div>Good Morning,</div><div><br></div><div><br></div>I am trying to write x/fillpolygon macro (see below) to call XFillPolygon as defined below:<br>
<div><br></div><div><span style="font-family:monospace;font-size:medium"><pre>XFillPolygon(<b>display</b>, <b>d</b>, <b>gc</b>, <b>points</b>, <b>npoints</b>, <b>shape</b>, <b>mode</b>)
      <a href="http://tronche.com/gui/x/xlib/display/opening.html#Display" target="_blank">Display</a> *<b>display</b>;
      Drawable <b>d</b>;
      <a href="http://tronche.com/gui/x/xlib/GC/manipulating.html" target="_blank">GC</a> <b>gc</b>;
      <a href="http://tronche.com/gui/x/xlib/graphics/drawing/#XPoint" target="_blank">XPoint</a> *<b>points</b>;
      int <b>npoints</b>;
      int <b>shape</b>; 
      int <b>mode</b>; 
</pre><div><span style="white-space:pre"><br></span></div></span></div><div><br></div><div><div>(defmacro x/fillpolygon (points &key (shape #$Complex) (mode #$CoordModeOrigin))</div><div>"points is a list of pairs, shape is one of Complex, Convex,  or Nonconvex, and</div>

<div>mode is one of CoordModeOrigin or CoordModePrevious."</div><div>    `(rlet ((xpoints (:array :<XP>oint ,(length points))))</div><div>       (let ((i 0))</div><div><span style="white-space:pre">  </span> (dolist (p ,points)</div>

<div><span style="white-space:pre">       </span>   (rlet ((xpoint :<XP>oint))</div><div><span style="white-space:pre">              </span> (setf (pref xpoint :<XP>oint.x) (car p))</div>
<div><span style="white-space:pre">               </span> (setf (pref xpoint :<XP>oint.y) (cdr p))</div><div><span style="white-space:pre">               </span> (setf (paref xpoints (:array :<XP>oint ,(length points)) i) xpoint)</div>

<div><span style="white-space:pre">               </span> (incf i)))</div><div><span style="white-space:pre">   </span> (#_XFillPolygon *display* </div><div><span style="white-space:pre">                      </span> (window *context*)</div>
<div><span style="white-space:pre">                       </span> (graphics-context *context*)</div><div><span style="white-space:pre">                 </span> xpoints</div><div><span style="white-space:pre">                      </span> ,(length points)</div>
<div><span style="white-space:pre">                       </span> ,shape</div><div><span style="white-space:pre">                       </span> ,mode</div><div><span style="white-space:pre">                        </span> ))))</div>
<div><br></div><div><br></div><div>I am not sure if I am correctly defining xpoints, what is the correct code to call #_XFillPolygon?</div><div><br></div><div>example of usage:</div><div><br></div><div>> (x/fillpolygon '((100 40) (140 50) (130 60)))</div>

<div><br></div><div><br></div><div>Kind regards</div><div>Taoufik</div><div><br></div><div><br></div><div><br></div></div>
</blockquote></div></div></blockquote></div></div></div></blockquote></div><div><br class="Apple-interchange-newline">
</div>
<br></body></html>