(define-library (cuprate rewriters) (import (scheme base) (only (foment base) error-object-type error-object-who error-object-kind)) (export rewriters rewrite) (begin (define (default-on-pair pair) (cons (test-rewrite (car pair)) (test-rewrite (cdr pair)))) (define (default-on-vector vec) (vector-map test-rewrite vec)) (define (default-on-error error) (let ((msg (error-object-message error)) (irritants (error-object-irritants error))) `(error (type ,(test-rewrite (error-object-type error))) (who ,(test-rewrite (error-object-who error))) (kind ,(test-rewrite (error-object-kind error))) (msg ,(test-rewrite (error-object-message error))) (irritants ,@(map test-rewrite (error-object-irritants error)))))) (define rewriters (make-parameter `((,pair? . ,default-on-pair) (,vector? . ,default-on-vector) (,error-object? . ,default-on-error)))) (define (rewrite obj) (let loop ((rewriters (rewriters))) (cond ((null? rewriters) obj) (((caar rewriters) obj) ((cdar rewriters) obj)) (else (loop (cdr rewriters))))))))