(defmacro push-ip (a l) "Destructively pushes A onto L (which really had better be a list) and returns A" `(progn (cond ((null ,l) (setf ,l (list ,a))) (t (setf (locf(cdr ,l)) (push ,a ,l)))) ,a )) (defun gsoc (v l) (print 'gsoc) (assoc v l)) (defmacro psoc (v l a) `(let ( (place (gsoc ,v ,l)) ) (if place (rplacd place ,a) (push-ip (cons ,v ,a) ,l)))) (defmacro psoc (v l a) `(rplacd (or (gsoc ,v ,l) (car(push (ncons ,v) ,l))) ,a)) (defsetf gsoc psoc)