I've extended with-foreign-slots to return slot pointers in this fashion (basically I took this macro with minor modifications but named it with-foreign-slots).
Liam On Thu, Apr 25, 2013 at 10:23 PM, Liam Healy <l...@healy.washington.dc.us>wrote: > On Thu, Apr 25, 2013 at 4:33 AM, Chris Bagley <chris.bag...@gmail.com>wrote: > >> I ran into similar issues to Willem and have taken to using the following >> macro: >> >> (defmacro with-foreign-slots* ((vars ptr type) &body body) >> "Create local symbol macros for each var in VARS to reference >> foreign slots in PTR of TYPE. Similar to WITH-SLOTS. >> Each var can be of the form: slot-name - in which case slot-name will >> be bound to the value of the slot or: (:pointer slot-name) - in which >> case slot-name will be bound to the pointer to that slot." >> (let ((ptr-var (gensym "PTR"))) >> `(let ((,ptr-var ,ptr)) >> (symbol-macrolet >> ,(loop :for var :in vars :collect >> (if (listp var) >> (if (eq (first var) :pointer) >> `(,(second var) (foreign-slot-pointer >> ,ptr-var ',type ',(second var))) >> (error "Malformed var names must be:~%name~% >> -or- ~%(:pointer name)")) >> `(,var (foreign-slot-value >> ,ptr-var ',type ',var)))) >> ,@body)))) >> >> This, for me, balances the needs quite nicely and feels in line with the >> style of cffi. Thoughts or modifications? >> > > I had thought about doing something like this when looking into Willem's > problems. I like it, but I think the "*" in the name is unnecessary. It is > upwardly compatible with the current with-foreign-slots, isn't it? That is, > if it were to replace with-foreign-slots, it would expand correctly for > current usage (to values). I think we should replace that macro with this. > > Liam > >