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