Misc. fixes to SUBSEQ, tests
authorOwen Rodley <Strigoides@gmail.com>
Fri, 10 May 2013 01:02:04 +0000 (13:02 +1200)
committerOwen Rodley <Strigoides@gmail.com>
Fri, 10 May 2013 01:02:04 +0000 (13:02 +1200)
src/sequence.lisp
tests/seq.lisp

index 7b8fa4e..8d2701b 100644 (file)
            ((minusp diff)
             (error "Start index must be smaller than end index"))
            (t
-            (let* ((drop-a (nthcdr a seq))
+            (let* ((drop-a (copy-list (nthcdr a seq)))
                    (pointer drop-a))
-              (dotimes (n (1- diff))
+              (dotimes (_ (1- diff))
                 (setq pointer (cdr pointer))
                 (when (null pointer)
                   (error "Ending index larger than length of list")))
-              (setf (cdr pointer) nil) 
+              (rplacd pointer ()) 
               drop-a))))
-       (nthcdr a seq)))
+       (copy-list (nthcdr a seq))))
     ((arrayp seq) 
      (if b
        (slice seq a b)
index c117831..1f2ffc2 100644 (file)
@@ -13,3 +13,9 @@
 (let ((v1 (remove-if #'zerop #(1 0 2 0 3))))
   (test (and (= (aref v1 0) 1) (= (aref v1 1) 2) (= (aref v1 2) 3)))) 
 (test (every #'zerop (remove-if-not #'zerop #(1 0 2 0 3))))
+
+(let ((nums '(1 2 3 4 5)))
+  (test (equal (subseq nums 3) '(4 5)))
+  (test (equal (subseq nums 2 4) '(3 4)))
+  ; Test that nums hasn't been altered: SUBSEQ should construct fresh lists
+  (test (equal nums '(1 2 3 4 5))))