(defmacro define-access (F A)
(let ((X (gensym))
(Y (gensym)))
`(progn
(defun ,F (,X)
(,A ,X))
(defsetf ,F (,X) (,Y)
`(setf (,',A ,,X) ,,Y)))))
; your code goes here
(pprint (macroexpand '(define-access fname car)))
(define-access fname car)
(pprint (macroexpand '(setf (fname foo) bar)))
(defvar var (list 1 2 3))
(setf (fname var) 10)
(pprint var)
KGRlZm1hY3JvIGRlZmluZS1hY2Nlc3MgKEYgQSkKICAobGV0ICgoWCAoZ2Vuc3ltKSkKICAgICAgICAoWSAoZ2Vuc3ltKSkpCiAgICBgKHByb2duCiAgICAgICAoZGVmdW4gLEYgKCxYKQogICAgICAgICAoLEEgLFgpKQogICAgICAgKGRlZnNldGYgLEYgKCxYKSAoLFkpCiAgICAgICAgIGAoc2V0ZiAoLCcsQSAsLFgpICwsWSkpKSkpCiA7IHlvdXIgY29kZSBnb2VzIGhlcmUKIAogKHBwcmludCAobWFjcm9leHBhbmQgJyhkZWZpbmUtYWNjZXNzIGZuYW1lIGNhcikpKQogKGRlZmluZS1hY2Nlc3MgZm5hbWUgY2FyKQoocHByaW50IChtYWNyb2V4cGFuZCAnKHNldGYgKGZuYW1lIGZvbykgYmFyKSkpCihkZWZ2YXIgdmFyIChsaXN0IDEgMiAzKSkKKHNldGYgKGZuYW1lIHZhcikgMTApCihwcHJpbnQgdmFyKQ==