-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild.zp
53 lines (49 loc) · 1.76 KB
/
build.zp
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
(define (build-json stream)
(if (null? stream)
'()
(let* ((token (car stream))
(token-key (car token))
(token-val (cadr token)))
(cond
((in? ["json-string" "json-num"] token-key)
(build-json-simple token))
((eq? token-key "json-null") (nil))
((eq? token-key "json-array") (build-json-array token-val))
((eq? token-key "json-object") (build-json-object token-val))))))
(define (build-json-all stream)
(define (build-all-json tokens acc)
(if (null? tokens)
acc
(begin
(define tuple (build-json (car tokens)))
(build-all-json (cdr tokens) (++ acc tuple)))))
(build-json stream '()))
(define (build-json-simple value)
(let ((key (car value))
(val (cadr value)))
(cond
((eq? key "json-string") val)
((eq? key "json-num") (string->number val)))))
(define (build-json-array values)
(if (null? values)
'()
(let* ((element (car values))
(element-key (car element)))
(case element-key
(("json-string" "json-num")
(cons (build-json-simple element)
(build-json-array (cdr values))))
(("json-object")
(cons (build-json (list element))
(build-json-array (cdr values))))
(else (build-json-array (cdr values)))))))
(define (build-json-object values)
(if (null? values)
#{}
(let* ((key (car values))
(value (list:ref values 2)))
(if (> (length values) 3)
(make-hash (build-json-simple key) (build-json (list value))
(build-json-object (cddddr values)))
(make-hash (build-json-simple key) (build-json (list value))
(build-json-object (cdddr values)))))))