#-(and) "

P17 (*) Split a list into two parts; the length of the first part is given.
    Do not use any predefined predicates.

    Example:
    * (split '(a b c d e f g h i k) 3)
    ( (A B C) (D E F G H I K))
"



;; Recursive function:

(defun split (list count)
  (if (plusp count)
      (destructuring-bind (left right) (split (rest list) (1- count))
        (list (cons (first list) left) right))
      (list '() list)))


;; Iterative function:

(defun split (list count)
  (loop
     :for rest :on list
     :repeat count
     :collect (first rest) :into left
     :finally (return (list left rest))))


;; Smartass solution, using Common Lisp.

(defun split (list count)
  (list (subseq list 0 count)
        (subseq list count)))


;; Smartass solution, using Common Lisp, and sharing the tail:

(defun split (list count)
  (list (subseq list 0 count)
        (nthcdr count list)))


;;;; THE END ;;;;
ViewGit