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

g:cadr:id:g000001:20080321の記事をみて、パターンマッチが無性に使いたくなったのでGaucheで実装してみる。

末尾再帰にしなければ、意外とすっきり書ける?

(use util.match)

(define (encode-direct lis)
  (match lis
    [() '()]
    [(a) (list a)]
    [((num a) . b)
     (if (eqv? a (car b))
         (encode-direct (cons (list (+ 1 num) a) (cdr b)))
         (cons (list num a) (encode-direct b)))]
    [(a . b)
     (if (eqv? a (car b))
         (encode-direct (cons (list 2 a) (cdr b)))
         (cons a (encode-direct b)))]))

(encode-direct '(a a a a b c c a d d e e e e))
;; => ((4 a) b (2 c) a (2 d) (4 e))
(encode-direct '(a a a a b c c a d d e))
;; => ((4 a) b (2 c) a (2 d) e)
(encode-direct '())
;; => ()