
(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)
