aboutsummaryrefslogtreecommitdiffstats
path: root/lib/cuprate/rewriters.chicken.sld
blob: 82a275c83f0f4a00ba55912beecdb600dd34077e (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
33
34
35
(define-library (cuprate rewriters)
  (import (scheme base) (scheme write)
          (chicken memory representation)
          (chicken condition))
  (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)
      (cons 'error
            (cons (error-object-message error)
                  (error-object-irritants error))))
    (define (default-on-condition cond)
      (map rewrite (condition->list cond)))
    (define (default-on-record rec)
      `(record (name ,(rewrite (record-instance-type rec)))
               (elements
                ,(vector-map rewrite (record->vector rec)))))
    (define rewriters
      (make-parameter
       `((,pair? . ,default-on-pair)
         (,vector? . ,default-on-vector)
         (,error-object? . ,default-on-error)
         (,condition? . ,default-on-condition)
         (,record-instance? . ,default-on-record))))
    (define (rewrite obj)
      (let loop ((rewriters (rewriters)))
        (cond
          ((null? rewriters) obj)
          (((caar rewriters) obj) ((cdar rewriters) obj))
          (else (loop (cdr rewriters))))))))