-
Notifications
You must be signed in to change notification settings - Fork 0
/
examples.scm
170 lines (133 loc) · 3.7 KB
/
examples.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
;;;; Examples
;;;
;;; Time to show off what our analyzer can do!
(define test1-should-fail
'(begin
(define x 4)
(define y
(if (query my_x x)
"a"
#\e))
(+ y 7)
(string-append y "e")))
(define analysis (tscheme:analyze test1-should-fail))
(car analysis)
;Value: failure
(print-recursive analysis)
;(
; failure
; branch4
; (
; CONSTRAINT[(-2)](string requires ((string all)))
; CONSTRAINT[(17)](branch4 requires ((boolean all) (number all) (char all) (string all) (symbol all) (pair all) (procedure all))) FROM CODE (if (query my_x x) "a" #\e)
; CONSTRAINT[(20)](branch4 requires (arg plus 0)) FROM CODE (+ y 7)
; CONSTRAINT[(25)](branch4 requires (arg string-append 0)) FROM CODE (string-append y "e")
; )
;)
(define test2-should-succeed
'(begin
(define x 4)
(define y
(if (query my_x x)
"a"
#\e))
(string-append y "e")))
(define analysis (tscheme:analyze test2-should-succeed))
(car analysis)
;Value: ((my_x x1))
(query-lookup 'my_x analysis)
;(
; x1
; ((number (finite-set 4)))
; (
; CONSTRAINT[(28)](x1 equals ((number (finite-set 4)))) FROM CODE 4
; )
;)
(define fact-test-should-succeed
(rw:rewrite
'(define (fact n)
(if (< n 2)
n
(* n (fact (- n 1)))))))
;; Show rewriting
(pp fact-test-should-succeed)
;(define fact
; (lambda (n)
; (begin (if (< n 2) n (* n (fact (- n 1)))))))
(define analysis (tscheme:analyze fact-test-should-succeed))
analysis
; Gives a bunch of deductions
(define fact-test-should-fail
(rw:rewrite
'(define (fact n)
(if (< n "2")
n
(* n (fact (- n 1)))))))
;; Show rewriting
(pp fact-test-should-fail)
;(define fact
; (lambda (n)
; (begin (if (< n "2") n (* n (fact (- n 1)))))))
(define analysis (tscheme:analyze fact-test-should-fail))
(car analysis)
;Value: failure
(define delayed-binding-test-succeed
'(begin
(define f (lambda () (query x x)))
(define x 3)))
(define analysis (tscheme:analyze delayed-binding-test-succeed))
(query-lookup 'x analysis)
;(
; x3
; ((number (finite-set 3)))
; (
; CONSTRAINT[(3)](x4 equals ((number (finite-set 3)))) FROM CODE 3
; CONSTRAINT[(4)](x4 equals x3) LEFT (delayed-binding-of x)
; )
;)
(define shadowing-test-succeed
'(begin
(define g (lambda () (begin x)))
(lambda (x)
(+ x 5))
(define x "a")
(string-append (g) "e")))
(define analysis (tscheme:analyze shadowing-test-succeed))
analysis
; (() (a bunch of deductions))
;; This is pretty subtle. Because x within g ends up getting bound to the
;; memory location that gets filled with "a", having (+ x 1) inside the body of
;; g is a problem, assuming the programmer expects to be able to ever run g.
(define shadowing-test-fail
'(begin
(define g (lambda () (+ x 1)))
(lambda (x)
(+ x 5))
(define x "a")
(string-append (g) "e")))
(define analysis (tscheme:analyze shadowing-test-fail))
analysis
; (failure x4 ([constraint] ...))
(define mutual-recursion-test-succeed
'(begin
(define f (lambda (x)
(begin
(g "a")
(+ x 7))))
(define g (lambda (y)
(begin
(f 4))))))
(define analysis (tscheme:analyze mutual-recursion-test-succeed))
;; Succeeds
(define mutual-recursion-test-fail
'(begin
(define f (lambda (x)
(begin
(g "a")
(+ x 7))))
(define g (lambda (y)
(begin
(f y))))))
(define analysis (tscheme:analyze mutual-recursion-test-fail))
;; Failure: g has to able to accept "a", so f has to be able to accept "a", but
;; it doesn't