(defmacro it-null/not-conds (test)
(loop for null/not in '(null identity)
 for ok in '(nil T)
 collecting `((,null/not ,test) (values it ,ok))))

(defmacro a-captive (form) `(locally (declare (local it)) (setf it ,form)))

(defmacro its-all-cond-you (condition.responses)
 `(let ((it)) (declare (local it))
   (cond ,@condition.responses
        (t (error "Unhandled condition")))))

(block definitions
(defmethod k-get ((obj cons) name)
 `(let ((obj ',obj) (name ',name))
   (declare (local name))
 ,#{ `(its-all-cond-you
     ,#{ `(it-null/not-conds
         ,#{ `(a-captive (assoc name obj)) } ) } ) }))
(defmethod k-get-by-id ((obj cons) id) (rassoc id obj))
(defmethod make-next-id-genie ((obj cons))
 (let ((try-id 0))
  (lambda ()
   (loop while (k-get-by-id obj try-id)
    do (incf try-id) finally (return try-id)))))

(defmethod k-add ((obj cons) name)
 (let ((id-er (make-next-id-genie obj)))
  (push (cons name (funcall id-er)) obj)))

(defmethod k-add-with-id ((obj cons) name id)
 (push (cons name id) obj)))

(block ad-hoc-tests
'(let ((k (pairlis nil nil))) (k-get k "foo")))