diff --git a/sequences.lisp b/sequences.lisp index b1e153342403ec48d1cb8edcf5f66ddb848eb456..2c797b96663da9144c742886f08743e3b26bf914 100644 --- a/sequences.lisp +++ b/sequences.lisp @@ -5,6 +5,26 @@ ;; macro, because inlining seems to cancel compiler macros (at least on SBCL). (declaim (inline copy-sequence sequence-of-length-p)) +(defun sequence-of-length-p (sequence length) + "Return true if SEQUENCE is a sequence of length LENGTH. Signals an error if +SEQUENCE is not a sequence. Returns FALSE for circular lists." + (declare (type array-index length) + (inline length) + (optimize speed)) + (etypecase sequence + (null + (zerop length)) + (cons + (let ((n (1- length))) + (unless (minusp n) + (let ((tail (nthcdr n sequence))) + (and tail + (null (cdr tail))))))) + (vector + (= length (length sequence))) + (sequence + (= length (length sequence))))) + (defun rotate-tail-to-head (sequence n) (declare (type (integer 1) n)) (if (listp sequence) @@ -172,26 +192,6 @@ is a literal integer." length current))))))))))))) -(defun sequence-of-length-p (sequence length) - "Return true if SEQUENCE is a sequence of length LENGTH. Signals an error if -SEQUENCE is not a sequence. Returns FALSE for circular lists." - (declare (type array-index length) - (inline length) - (optimize speed)) - (etypecase sequence - (null - (zerop length)) - (cons - (let ((n (1- length))) - (unless (minusp n) - (let ((tail (nthcdr n sequence))) - (and tail - (null (cdr tail))))))) - (vector - (= length (length sequence))) - (sequence - (= length (length sequence))))) - (defun copy-sequence (type sequence) "Returns a fresh sequence of TYPE, which has the same elements as SEQUENCE."