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