aboutsummaryrefslogtreecommitdiffstats
path: root/lib/cuprate/rewriters/foment.sld
blob: 248e2efa03bfd664b9bdae21e1d21a7f416e4d93 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(define-library (cuprate rewriters foment)
  (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 (rewrite (car pair))
            (rewrite (cdr pair))))
    (define (default-on-vector vec)
      (vector-map rewrite vec))
    (define (default-on-error error)
      (let ((msg (error-object-message error))
            (irritants (error-object-irritants error)))
        `(error (type ,(rewrite (error-object-type error)))
                (who ,(rewrite (error-object-who error)))
                (kind ,(rewrite (error-object-kind error)))
                (msg ,(rewrite (error-object-message error)))
                (irritants ,@(map 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))))))))