連続した数列を範囲形式にまとめたい

整列済みの number のリストがある。
(1 3 4 5 6 12 13 15)
このようなリストで数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみを書くような記法を導入する。
最初の例のリストであれば以下のようになる。
(1 (3 . 6) (12 . 13) 15)
このようなリストの変換をするコードを書きたい。

http://d.hatena.ne.jp/higepon/20080925/1222326246

前にHaskellで似たもの書いたことがあったので、練習にSchemeに移植してみた。
Haskellのガードが条件を|の後ろに別に書くのに対して、? predicate は条件を指定したい場所に直接書くのが勉強になった。

(use util.match)
(define f (match-lambda
  (() ())
  ((x . xs) (let1 p (lambda (y) (and (number? y) (= (- y x) 1)))
    (match (f xs) ((((? p y) . z) . r) (cons (cons x z) r))
                  (((? p y) . r)       (cons (cons x y) r))
                  (r                   (cons x r)))))))

実行結果

gosh> (f '(1 3 4 5 6 12 13 15))
(1 (3 . 6) (12 . 13) 15)

前に書いたHaskell版はこれ。
リスト中の型をそろえる必要があるので全ての要素がリストのリストになっているところがちょっと違う。

連続した数列を範囲形式にまとめたい

http://d.hatena.ne.jp/katona/20080422/p1

追記
iRiEさんのアドバイス+αの別バージョン

(define f (match-lambda
  (() ())
  ((x . xs) (let1 p (pa$ eq? (+ x 1))
    (match (f xs) ((or (((? p) . y) . r) ((? p y) . r)) `((,x ,@y) ,@r))
                  (r `(,x ,@r)))))))