+ ((listp seq) (list-remove-if func seq t))
+ ((arrayp seq) (vector-remove-if func seq t))
+ (t (not-seq-error seq))))
+
+(defun list-remove-if (func list negate)
+ (if (endp list)
+ ()
+ (let ((test (funcall func (car list))))
+ (if (if negate (not test) test)
+ (list-remove-if func (cdr list) negate)
+ (cons (car list) (list-remove-if func (cdr list) negate))))))
+
+(defun vector-remove-if (func vector negate)
+ (let ((out-vector (make-array 0)))
+ (do-sequence (element vector i)
+ (let ((test (funcall func element)))
+ (when (if negate test (not test))
+ (vector-push-extend element out-vector))))
+ out-vector))
+
+(defun subseq (seq a &optional b)
+ (cond
+ ((listp seq)
+ (if b
+ (let ((diff (- b a)))
+ (cond
+ ((zerop diff) ())
+ ((minusp diff)
+ (error "Start index must be smaller than end index"))
+ (t
+ (let* ((drop-a (copy-list (nthcdr a seq)))
+ (pointer drop-a))
+ (dotimes (_ (1- diff))
+ (setq pointer (cdr pointer))
+ (when (null pointer)
+ (error "Ending index larger than length of list")))
+ (rplacd pointer ())
+ drop-a))))
+ (copy-list (nthcdr a seq))))
+ ((vectorp seq)
+ (let* ((b (or b (length seq)))
+ (size (- b a))
+ (new (make-array size :element-type (array-element-type seq))))
+ (do ((i 0 (1+ i))
+ (j a (1+ j)))
+ ((= j b) new)
+ (aset new i (aref seq j)))))
+ (t (not-seq-error seq))))
+
+(defun copy-seq (sequence)
+ (subseq sequence 0))