Scheme どう書く?的

整列済みの number のリストがある。

'(1 3 4 5 6 12 13 15)

このようなリストで数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみを書くような記法を導入する。

最初の例のリストであれば以下のようになる。

'(1 (3 . 6) (12 . 13) 15)

このようなリストの変換をするコードを書きたい。

こんな感じか。

(define (compact-number-list ls)
  (define (loop start n ls ns)  
    (cond [(or (null? ls) (not (= (+ n 1) (car ls))))
           (rec ls (acons start n ns))]
          [else (loop start (+ n 1) (cdr ls) ns)]))
  (define (rec ls ns)
    (cond [(or (null? ls) (null? (cdr ls)))
           (reverse (append ls ns))]
          [(= (cadr ls) (+ (car ls) 1))
           (loop (car ls) (cadr ls) (cddr ls) ns)]
          [else (rec (cdr ls) (cons (car ls) ns))]))
  (rec ls '()))

うん、まぁ何の面白みもないコードですいませんが。