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])))