+(defmacro doseq ((elt seq &optional index) &body body)
+ (let* ((nseq (gensym "seq"))
+ (i (or index (gensym "i")))
+ (list-body (if index
+ `(let ((,i -1))
+ (dolist (,elt ,nseq)
+ (incf ,i)
+ ,@body))
+ `(dolist (,elt ,nseq)
+ ,@body))))
+ `(let ((,nseq ,seq))
+ (if (listp ,nseq)
+ ,list-body
+ (dotimes (,i (length ,nseq))
+ (let ((,elt (aref ,nseq ,i)))
+ ,@body))))))
+
+(defun find (item seq &key key (test #'eql))
+ (if key
+ (doseq (x seq)
+ (when (funcall test (funcall key x) item)
+ (return x)))
+ (doseq (x seq)
+ (when (funcall test x item)
+ (return x)))))
+
+(defun remove (x seq)