<div dir="ltr">I ran into similar issues to Willem and have taken to using the following macro:<br><br><div class="gmail_extra">(defmacro with-foreign-slots* ((vars ptr type) &body body)<br> "Create local symbol macros for each var in VARS to reference<br>
foreign slots in PTR of TYPE. Similar to WITH-SLOTS.<br>Each var can be of the form: slot-name - in which case slot-name will<br>be bound to the value of the slot or: (:pointer slot-name) - in which <br>case slot-name will be bound to the pointer to that slot."<br>
(let ((ptr-var (gensym "PTR")))<br> `(let ((,ptr-var ,ptr))<br> (symbol-macrolet<br> ,(loop :for var :in vars :collect<br> (if (listp var)<br> (if (eq (first var) :pointer)<br>
`(,(second var) (foreign-slot-pointer<br> ,ptr-var ',type ',(second var)))<br> (error "Malformed var names must be:~%name~% -or- ~%(:pointer name)"))<br>
`(,var (foreign-slot-value<br> ,ptr-var ',type ',var))))<br> ,@body))))<br><br>This, for me, balances the needs quite nicely and feels in line with the style of cffi. Thoughts or modifications?<br>
</div></div>