anchor.diff:  ;;;
   ;;;; Operations on lists. Where possible, both modifying and non-modifying
   ;;;; versions are given.
  +;;;
  +;;;; FIXME: SPLIT-LIST and NSPLIT-LIST take a non-negative FIXNUM as their
  +;;;; length argument. This improves the code generated by SBCL significantly,
  +;;;; but is it the right thing to do? (INTEGER 0 MOST-POSITIVE-FIXNUM) should
  +;;;; probably be given a proper name either way.
   
   (in-package :sj-lisp)
   
  
positive.code: ;;; effectively the same as:
  ;;;
  ;;;    (VALUES (BUTLAST LIST (- (LENGTH LIST) N)
  ;;;            (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
  ;;;            (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) n))
    (if from-end
        (loop
           for head-cursor on list
           for tail-cursor on (nthcdr n list)
           collecting (car head-cursor) into first-list
           when (not (consp (cdr tail-cursor)))
           do (return (values first-list
                              (copy-list (cdr head-cursor)))))
        (loop
           for head-cursor on list
           for i from 1 to n
  
negative.code: ;;; 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 #.most-positive-fixnum) n))
    (labels ((split-front (list n) ;; Break off and return the second list
               (if (zerop n)
                   list
  