-
Notifications
You must be signed in to change notification settings - Fork 0
/
sym-substeval.rkt
68 lines (58 loc) · 1.86 KB
/
sym-substeval.rkt
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
#lang br/quicklang
(require simpl/utils)
(provide subst evaluate subst-eval update-sub retrieve-sub has-sym?)
(define ns (make-base-namespace))
(define subst
(lambda (sub e)
;(displayln (format "val in subtst-eval: ~a\ne in subst-eval: ~a\n" val e))
(match e
[(list 'array n values)
(list 'array n (subst sub values))]
[(list 'acc-arr x e)
(letrec ((ar (retrieve-sub sub x))
(i (subst sub e))
(ic (or (and (<= 0 i) (< i (list-ref ar 1))) (error "index out of bound"))))
(subst sub (list-ref (list-ref ar 2) i)))]
[(list (? bin-op? op) left right)
(list op (subst sub left) (subst sub right))]
[(list (? un-op? op) opnd)
(if (eq? op 'fac)
(fac (subst sub opnd))
(list op (subst sub opnd)))]
[(? list? x) (map (lambda (y) (subst sub y)) x)]
[(? number? x) x]
[(? boolean? x) x]
[(? string? x) x]
[(? symbol? x)
(retrieve-sub sub x)])))
(define evaluate
(lambda (e)
(match e
[(list 'array n values) (evaluate values)]
[(list (? bin-op? op) _ _) (eval e ns)]
[(list (? un-op? op) _) (eval e ns)]
[(? list? tuple) (map evaluate tuple)]
[(? number? x) x]
[(? boolean? x) x]
[(? string? x) x])))
(define subst-eval
(lambda (v e)
(evaluate (subst v e))))
(define update-sub
(lambda (sub x e)
(hash-set sub x e)))
(define retrieve-sub
(lambda (sub x)
;(displayln (format "val: ~a\nx: ~a" val x))
(hash-ref sub x)))
(define has-sym?
(lambda (e)
(match e
[(list 'array n values) (ormap has-sym? values)]
[(list (? bin-op? op) a b) (or (has-sym? a) (has-sym? b))]
[(list (? un-op? op) a) (has-sym? a)]
[(? list? tuple) (ormap has-sym? tuple)]
[(? number? x) #f]
[(? boolean? x) #f]
[(? symbol? x) #t]
[(? string? x) #f])))