anchor.diff:  ;;; The mutating, non-consing version of SPLIT-LIST.
   (defun nsplit-list (list &optional (n 1) &key from-end)
     (declare (type list list)
  -           (type (integer 0) n))
  +           (type (integer 0 #.most-positive-fixnum) n))
     (labels ((split-front (list n) ;; Break off and return the second list
                (if (zerop n)
                    list
  
positive.code: ;;;
  ;;;; Operations on lists. Where possible, both modifying and non-modifying
  ;;;; versions are given.
  
  (in-package :sj-lisp)
  
  
negative.code: ;;; effectively the same as:
  ;;;
  ;;;    (VALUES (BUTLAST LIST (- (LENGTH LIST) N)
  ;;;            (COPY-LIST (LAST LIST (- (LENGTH LIST) N))))
  ;;;
  ;;; but a bit more efficient, visiting each cell exactly once. If the FROM-END
  ;;; argument is supplied and is non-NIL, it is equivalent to:
  ;;;
  ;;;    (VALUES (BUTLAST LIST N
  ;;;            (COPY-LIST (LAST LIST N)))
  ;;;
  ;;; but again, probably faster. See also NSPLIT-LIST.
  (defun split-list (list &optional (n 1) &key from-end)
    (declare (type list list)
             (type (integer 0 #.most-positive-fixnum) n))
    (if from-end
        (loop
           for head-cursor on list
           for tail-cursor on (nthcdr n list)
           collecting (car head-cursor) into first-list
           finally (return (values first-list
                                   (copy-list head-cursor))))
        (loop
           for head-cursor on list
           for i from 1 to n
  