Luís Oliveira wrote: >> If I follow correctly, this can be more generally solved with a >> cross-platform setf-expander for POINTER-ADDRESS that requires its PTR >> arg to be a place, whereupon things like (incf (pointer-address >> *ptr*)) and any other place-modifier should work. > > Hmm. I find that a bit confusing. (incf (pointer-address foo)) really > makes it look look that foo's address is mutable.
No more than (incf (ldb (byte 2 1) foo)) makes it look as if the integer itself at FOO is mutable, unless you must take into account the prevalence of 1-arg slot accessors. > So, I propose incf-pointer again, this time without the double > evaluation bug: > > (define-modify-macro incf-pointer (&optional (offset 1)) inc-pointer) Simple enough for anyone to duplicate for future modifiers, too. I should spend more time expanding my symbology. For posterity, here is a setf-expander: (define-setf-expander pointer-address (ptr &environment env) (multiple-value-bind (temp-vars value-forms store-vars store-form access-form) (get-setf-expansion ptr env) (destructuring-bind (ptr-store-var) store-vars (with-unique-names (store-var) (values temp-vars value-forms (list store-var) `(let ((,ptr-store-var (make-pointer ,store-var))) ,store-form ,store-var) `(pointer-address ,access-form)))))) -- Stephen Compall http://scompall.nocandysw.com/blog _______________________________________________ cffi-devel mailing list cffi-devel@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel