It's funny how language features cluster. Racket has an implementation of CLOS, and it ships with a setf macro: https://docs.racket-lang.org/swindle/index.html