Below are three different implementations of remove-from-plist, all of which I find more aestetic than current alexandria's implementation. YMMV. I would favor the first one, which explicitly ditches error checking ("it's user responsibility", and a proper plist will be returned). In case somebody disagrees, the second implementation reintroduces it, albeit with a better error message. The third implementation checks for properness only at the end (outside the loop), while still being shorter than alexandria's implementation. I would also remove the FIXME, on grounds that if plists are long enough for that to matter, one shouldn't be using them anyway. (defun remove-from-plist (plist &rest keys) (loop for (key value) on plist by #'cddr unless (member key keys :test #'eq) collect key and collect value)) (defun remove-from-plist (plist &rest keys) (loop for (key . rest) on plist by #'cddr do (assert rest () "Expected a proper plist, got ~S" plist) unless (member key keys :test #'eq) collect key and collect (first rest))) (defun remove-from-plist (plist &rest keys) (loop with last = t for (key . rest) on plist by #'cddr do (setf last rest) unless (member key keys :test #'eq) collect key and collect (first rest) finally (assert last () "Expected a proper plist, got ~S" plist))) Cheers, Michael