ECL, defining the expander before DEFUN. Now calling the SETF function works but it also seems to no longer rely on our custom expander MACRO. > (load "/tmp/setf-test") ;;; Loading #P"/tmp/setf-test.fas" #P"/tmp/setf-test.fas" > (test) 1 > (get-setf-expansion '(foo-val *foo*)) (#:G110) (*FOO*) (#:G111) (FUNCALL #'(SETF FOO-VAL) #:G111 #:G110) (FOO-VAL #:G110) > (setf (foo-val *foo*) 2) 2 > *foo* (2) > ^D SBCL, defining the expander before DEFUN behemoth$ sbcl Couldn't stat /proc/curproc/file; is /proc mounted? This is SBCL 1.0.30, an implementation of ANSI Common Lisp. More information about SBCL is available at . SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. Couldn't stat /proc/curproc/file; is /proc mounted? * (load "/tmp/setf-test.lisp") T * (get-setf-expansion '(foo-val *foo*)) (#:G640) (*FOO*) (#:G641) (FOO-VAL-SETF-SETTER-MACRO #:G641 #:G640) (FOO-VAL-SETF-GETTER-MACRO #:G641) * (setf (foo-val *foo*) 3) 3 * (test) 1