lists.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/ (DIR) Log (DIR) Files (DIR) Refs (DIR) Tags (DIR) README (DIR) LICENSE --- lists.lisp (944B) --- 1 (in-package :alexandria-2) 2 3 (defun delete-from-plist* (plist &rest keys) 4 "Just like REMOVE-FROM-PLIST, but this version may destructively modify the 5 provided PLIST. 6 The second return value is an alist of the removed items, in unspecified order." 7 ;; TODO: a plist? 8 (declare (optimize speed)) 9 (loop with head = plist 10 with tail = nil ; a nil tail means an empty result so far 11 with kept = () 12 for (key . rest) on plist by #'cddr 13 do (assert rest () "Expected a proper plist, got ~S" plist) 14 (if (member key keys :test #'eq) 15 ;; skip over this pair 16 (let ((next (cdr rest))) 17 (push (cons key (car rest)) 18 kept) 19 (if tail 20 (setf (cdr tail) next) 21 (setf head next))) 22 ;; keep this pair 23 (setf tail rest)) 24 finally (return (values head kept))))