P09: 連続して出現したエレメントをまとめる。

pushが結構便利。

;;;
;; P09 (**) Pack consecutive duplicates of list elements into sub-lists.
;; If a list contains repeated elements they should be placed in separate
;; sub-lists.
;;
;; Example:
;; * (pack '(a a a a b c c a a d e e e e ))
;; ((a a a a) (b) (c c) (a a) (d) (e e e e))
(defun pack (lis)
  (if (null lis)
      lis
    (let ((acc `((,(first lis)))))
      (dolist (elem (rest lis))
	(if (eql (first (first acc)) elem)
	    (push elem (first acc))
	  (push (list elem) acc)))
      (reverse acc))))

(pack '(a a a a b c c  a a d e e e e))
;; => ((A A A A) (B) (C C) (A A) (D) (E E E E))
(pack '(nil nil nil nil nil t t t t t))
;; => ((NIL NIL NIL NIL NIL) (T T T T T))
(pack '(nil t t t t t nil))
;; => ((NIL) (T T T T T) (NIL))
(pack '())
;; => NIL