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