-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgambini.scm
110 lines (93 loc) · 2.95 KB
/
gambini.scm
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
;;
;; Reader customization
;; It adds support for a-list based maps using {} syntax
;;
(include "~~lib/_gambit#.scm")
(define foreign-writers (make-table))
(define structure-writers (make-table))
(define (write-foreign we obj)
(case (macro-writeenv-style we)
((mark)
(##wr-mark we obj))
(else
(let ((tags (##foreign-tags obj)))
(if (##pair? tags)
((table-ref foreign-writers (##car tags) ##wr-foreign) we obj)
(##wr-foreign we obj))))))
(define (write-structure we obj)
(case (macro-writeenv-style we)
((mark)
(##wr-mark we obj))
(else
((table-ref structure-writers (##structure-type obj) ##wr-structure)
we obj)))
)
(let ((old-wr ##wr))
(set! ##wr
(lambda (we obj)
(cond ((##foreign? obj)
(write-foreign we obj))
((##structure? obj)
(write-structure we obj))
(else
(old-wr we obj))))))
;; (table-set!
;; foreign-writers
;; 'point*
;; (lambda (we obj)
;; (##wr-str we "{")
;; (##wr we (point-x obj))
;; (##wr-str we ",")
;; (##wr we (point-y obj))
;; (##wr-str we "}")))
(define-type reader-map
id: reader-map-F9F00592-3D9F-468F-A10C-7260A6AA2DD7
type-exhibitor: reader-map-type
pairs)
(table-set!
structure-writers
(reader-map-type)
(lambda (we obj) (reader:map-print we obj)))
(define (reader:make-map . args)
(if (= 1 (length args))
;; The single-value function expects a map, and will produce a getter function
(lambda (key #!optional opt) (or (reader:map-get (car args) key) opt))
(make-reader-map
(let loop ((m '())
(args args))
(cond ((null? args)
m)
((null? (cdr args))
(error "maps must have an even number of elements"))
((assoc (car args) m)
(error "maps cannot have repeated keys"))
(else
(loop (cons `(,(car args) . ,(cadr args)) m)
(cddr args))))))))
(define (reader:map-get m key)
(let ((val (assoc key (reader-map-pairs m))))
(if val
(cdr val)
#f)))
(define (reader:map-foreach f m)
(let loop ((m (reader-map-pairs m)))
(if (not (null? m))
(begin (f (caar m) (cdar m))
(loop (cdr m))))))
(define (reader:map-print we m)
(##wr-str we "{")
(let ((first? #t))
(reader:map-foreach (lambda (key val)
(if (not first?) (##wr-str we ", "))
(##wr we key)
(##wr-str we " ")
(if (reader-map? val)
(reader:map-print we val)
(##wr we val))
(set! first? #f))
m))
(##wr-str we "}"))
;; Alter reader
(##vector-set! ##main-readtable 30 'reader:make-map)
;; (pp {a: 1 b: 2})
;; (pp (reader:map-foreach (lambda (k v) (println k "---" v)) {a: 1}))