【Scheme】区切りでリストをグループ化

区切りでリストをグループ化する関数を書いてみた。結構、悩んだ。

(define (group-list ls sep)
    (letrec ((iter (lambda (ls0 ls1)
                       (cond
                           ((null? ls0) (list (reverse ls1)))
                           ((eqv? (car ls0) sep)
                               (cons (reverse (cons sep ls1)) (iter (cdr ls0) '())))
                           (else (iter (cdr ls0) (cons (car ls0) ls1)))))))
        (iter ls '())))

でも、これだと、区切りがリストの最後のとき、リスト内に()が入ってしまうという問題がある。(例えば、(2 3 1 6 1 5 4 1)を1で区切ると((2 3 1) (6 1) (5 4 1) ())となる)そこで、以下のように修正した。

(define (group-list ls sep)
    (letrec ((iter (lambda (ls0 ls1)
                       (cond
                           ((null? ls0)
                               (if (null? ls1) '() (list (reverse ls1))))
                           ((eqv? (car ls0) sep)
                               (cons (reverse (cons sep ls1)) (iter (cdr ls0) '())))
                           (else (iter (cdr ls0) (cons (car ls0) ls1)))))))
        (iter ls '())))