![](https://secure.gravatar.com/avatar/1da667e5526c815eb7650dc596c59745.jpg?s=120&d=mm&r=g)
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?