P13 ランレングスエンコード

副作用ばりばりで。

;; P13
(defun encode-direct (lis)
  (if (null lis)
      lis
    (do ((acc '())
	 (target (car lis))
	 (count 1)
	 (l (cdr lis) (cdr l)))
	((null l) (reverse (cons target acc)))
      (if (and (eql target (car l)))
	  (incf count)
	(progn
	 (push (if (= count 1)
		   target
		 (list count target))
	       acc)
	 (setf target (car l)
	       count 1))))))

(encode-direct '(a a a a b c c a a d e e e e))
;; => ((4 A) B (2 C) (2 A) D (4 E))
(encode-direct '(a))
;; => (A)
(encode-direct '(nil))
;; => (NIL)
(encode-direct '())
;; => NIL
(encode-direct '(nil nil nil))
;; => ((3 NIL))