record->field-alist

R6RS の Records とそれを利用している Conditions は継承関係があるのでこんな手続きを書いた。

(define (map-with-index proc lst)
  (let loop ([i 0]
             [lst lst]
             [ret '()])
    (if (null? lst)
        (reverse ret)
        (loop (+ i 1) (cdr lst) (cons (proc i (car lst)) ret)))))
(define (record->field-alist r)
  (define (ref rtd i x)
    ((record-accessor rtd i) x))
  (let loop ([ret '()]
             [rtd (record-rtd r)])
    (cond
     [rtd
      (loop
       (append ret
               (map-with-index
                (lambda (i field)
                  (cons field (ref rtd i r)))
                (vector->list (record-type-field-names rtd))))
       (record-type-parent rtd))]
     [else ret])))