+
+(defun plist-remove (key plist &key (test #'eq))
+ (loop
+ for (%key value) on plist by #'cddr
+ while (and %key value)
+ unless (funcall test key %key)
+ nconc (list %key value)))
+
+(defun delete-collect-if (predicate seq)
+ (let ((head (cons nil seq)))
+ (values
+ (loop
+ for tmp on head
+ while (cdr tmp)
+ when (funcall predicate (second tmp))
+ collect (let ((elm (second tmp)))
+ (setf (cdr tmp) (cddr tmp))
+ elm))
+ (cdr head))))