diff options
Diffstat (limited to 'deque.lisp')
-rw-r--r-- | deque.lisp | 41 |
1 files changed, 20 insertions, 21 deletions
@@ -22,28 +22,27 @@ ;;; ;;; -(eval-when (:compile-toplevel :load-toplevel :execute) - (defun bisect-list (list &optional (minimum-length 0)) - (do ((double-skipper (cddr list) (cddr double-skipper)) - (single-skipper list (cdr single-skipper)) - (length 2 (+ length (if (cdr double-skipper) 2 1)))) - ((null double-skipper) - (cond - ((< length minimum-length) - (values list nil)) - ((consp single-skipper) - (multiple-value-prog1 - (values list (cdr single-skipper)) - (setf (cdr single-skipper) nil))) - (t (values list nil)))))) +(defun bisect-list (list &optional (minimum-length 0)) + (do ((double-skipper (cddr list) (cddr double-skipper)) + (single-skipper list (cdr single-skipper)) + (length 2 (+ length (if (cdr double-skipper) 2 1)))) + ((null double-skipper) + (cond + ((< length minimum-length) + (values list nil)) + ((consp single-skipper) + (multiple-value-prog1 + (values list (cdr single-skipper)) + (setf (cdr single-skipper) nil))) + (t (values list nil)))))) - (defun pop-deque-helper (facing-piece other-piece) - (if (null facing-piece) - (multiple-value-bind (head tail) (bisect-list other-piece 10) - (let ((remaining (if tail head)) - (moved (nreverse (or tail head)))) - (values (first moved) (rest moved) remaining))) - (values (first facing-piece) (rest facing-piece) other-piece)))) +(defun pop-deque-helper (facing-piece other-piece) + (if (null facing-piece) + (multiple-value-bind (head tail) (bisect-list other-piece 10) + (let ((remaining (if tail head)) + (moved (nreverse (or tail head)))) + (values (first moved) (rest moved) remaining))) + (values (first facing-piece) (rest facing-piece) other-piece))) (defmacro pop-deque (facing-piece other-piece) (let ((result (gensym)) |