@@ -42,6 +42,7 @@ static void init(obj execution_environment)
42
42
ambenv );
43
43
44
44
evalstr ("(define (analyze exp)"
45
+ // " (newline)(display \"Exp:\")(display exp)(newline)"
45
46
" (cond ((self-evaluating? exp) "
46
47
" (analyze-self-evaluating exp))"
47
48
" ((quoted? exp) (analyze-quoted exp))"
@@ -66,49 +67,45 @@ static void init(obj execution_environment)
66
67
" (error \" Unknown expression type-- ANALYZE \" exp))))" ,
67
68
ambenv );
68
69
evalstr ("(define (analyze-self-evaluating exp)"
69
- " (lambda (env) exp))" ,
70
+ " (lambda (env succeed fail)"
71
+ " (succeed exp fail)))" ,
70
72
ambenv );
71
73
evalstr ("(define (analyze-quoted exp)"
72
74
" (let ((qval (text-of-quotation exp)))"
73
- " (lambda (env) qval)))" ,
75
+ " (lambda (env succeed fail)"
76
+ " (succeed qval fail))))" ,
74
77
ambenv );
75
78
evalstr ("(define (analyze-variable exp)"
76
- " (lambda (env) (lookup-variable-value exp env)))" ,
79
+ " (lambda (env succeed fail)"
80
+ " (succeed (lookup-variable-value exp env)"
81
+ " fail)))" ,
77
82
ambenv );
78
-
79
- evalstr ("(define (analyze-assignment exp)"
80
- " (let ((var (assignment-variable exp))"
81
- " (vproc (analyze (assignment-value exp))))"
82
- " (lambda (env)"
83
- " (set-variable-value! var (vproc env) env)"
84
- " 'ok)))" ,
85
- ambenv );
86
-
87
- evalstr ("(define (analyze-definition exp)"
88
- " (let ((var (definition-variable exp))"
89
- " (vproc (analyze (definition-value exp))))"
90
- " (lambda (env)"
91
- " (define-variable! var (vproc env) env)"
92
- " 'ok)))" ,
83
+ evalstr ("(define (analyze-lambda exp)"
84
+ " (let ((vars (lambda-parameters exp))"
85
+ " (bproc (analyze-sequence (lambda-body exp))))"
86
+ " (lambda (env succeed fail)"
87
+ " (succeed (make-procedure vars bproc env)"
88
+ "fail))))" ,
93
89
ambenv );
94
-
95
90
evalstr ("(define (analyze-if exp)"
96
91
" (let ((pproc (analyze (if-predicate exp)))"
97
92
" (cproc (analyze (if-consequent exp)))"
98
93
" (aproc (analyze (if-alternative exp))))"
99
- " (lambda (env)"
100
- " (if (true? (pproc env))"
101
- " (cproc env)"
102
- " (aproc env)))))" ,
103
- ambenv );
104
- evalstr ("(define (analyze-lambda exp)"
105
- " (let ((vars (lambda-parameters exp))"
106
- " (bproc (analyze-sequence (lambda-body exp))))"
107
- " (lambda (env) (make-procedure vars bproc env))))" ,
94
+ " (lambda (env succeed fail)"
95
+ " (pproc env"
96
+ " (lambda (pred-value fail2)"
97
+ " (if (true? pred-value)"
98
+ " (cproc env succeed fail2)"
99
+ " (aproc env succeed fail2)))"
100
+ " fail))))" ,
108
101
ambenv );
109
102
evalstr ("(define (analyze-sequence exps)"
110
- " (define (sequentially proc1 proc2)"
111
- " (lambda (env) (proc1 env) (proc2 env)))"
103
+ " (define (sequentially a b)"
104
+ " (lambda (env succeed fail)"
105
+ " (a env"
106
+ " (lambda (a-value fail2)"
107
+ " (b env succeed fail2))"
108
+ " fail)))"
112
109
" (define (loop first-proc rest-procs)"
113
110
" (if (null? rest-procs)"
114
111
" first-proc"
@@ -119,45 +116,114 @@ static void init(obj execution_environment)
119
116
" (error \"Empty sequence -- ANALYZE\"))"
120
117
" (loop (car procs) (cdr procs))))" ,
121
118
ambenv );
122
- evalstr ("(define (analyze-apply exp)"
123
- " (let ((fproc (analyze (apply-operator exp)))"
124
- " (argsproc (analyze (apply-operands exp))))"
125
- " (lambda (env)"
126
- " (execute-application (fproc env)"
127
- " (argsproc env)))))" ,
119
+ evalstr ("(define (analyze-definition exp)"
120
+ " (let ((var (definition-variable exp))"
121
+ " (vproc (analyze (definition-value exp))))"
122
+ " (lambda (env succeed fail)"
123
+ " (vproc env"
124
+ " (lambda (val fail2)"
125
+ " (define-variable! var val env)"
126
+ " (succeed 'ok fail2))"
127
+ " fail))))" ,
128
128
ambenv );
129
+ evalstr ("(define (analyze-assignment exp)"
130
+ " (let ((var (assignment-variable exp))"
131
+ " (vproc (analyze (assignment-value exp))))"
132
+ " (lambda (env succeed fail)"
133
+ " (vproc env"
134
+ " (lambda (val fail2)"
135
+ " (let ((old-value"
136
+ " (lookup-variable-value var env)))"
137
+ " (set-variable-value! var val env)"
138
+ " (succeed 'ok"
139
+ " (lambda ()"
140
+ " (set-variable-value! var"
141
+ " old-value"
142
+ " env)"
143
+ " (fail2)))))"
144
+ " fail))))" ,
145
+ ambenv );
146
+ // evalstr("(define (analyze-apply exp)"
147
+ // " (let ((fproc (analyze (apply-operator exp)))"
148
+ // " (argsproc (analyze (apply-operands exp))))"
149
+ // " (lambda (env succeed fail) "
150
+ // "(display \" ** HERE ** \")"
151
+ // " (fproc env"
152
+ // " (lambda (proc fail2)"
153
+ // " (argsproc env"
154
+ // " (lambda (args fail3)"
155
+ // " (execute-application proc args succeed fail3)"
156
+ // " )"
157
+ // " fail2"
158
+ // " )"
159
+ // " )"
160
+ // " fail))))",
161
+ // ambenv);
129
162
evalstr ("(define (analyze-application exp)"
130
163
" (let ((fproc (analyze (operator exp)))"
131
164
" (aprocs (map analyze (operands exp))))"
132
- " (lambda (env)"
133
- " (execute-application (fproc env)"
134
- " (map (lambda (aproc) (aproc env))"
135
- " aprocs)))))" ,
165
+ " (lambda (env succeed fail) "
166
+ " (fproc env"
167
+ " (lambda (proc fail2)"
168
+ " (get-args aprocs"
169
+ " env"
170
+ " (lambda (args fail3)"
171
+ " (execute-application"
172
+ " proc args succeed fail3))"
173
+ " fail2))"
174
+ " fail))))" ,
136
175
ambenv );
137
- evalstr ("(define (execute-application proc args)"
176
+ evalstr ("(define (get-args aprocs env succeed fail)"
177
+ " (if (null? aprocs)"
178
+ " (succeed '() fail)"
179
+ " ((car aprocs) env"
180
+ " (lambda (arg fail2)"
181
+ " (get-args (cdr aprocs)"
182
+ " env"
183
+ " (lambda (args fail3)"
184
+ " (succeed (cons arg args)"
185
+ " fail3))"
186
+ " fail2))"
187
+ " fail)))" ,
188
+ ambenv );
189
+ evalstr ("(define (execute-application proc args succeed fail)"
138
190
" (cond ((primitive-procedure? proc)"
139
- " (apply-primitive-procedure proc args))"
191
+ " (succeed (apply-primitive-procedure proc args)"
192
+ " fail))"
140
193
" ((compound-procedure? proc)"
141
194
" ((procedure-body proc)"
142
195
" (extend-environment (procedure-parameters proc)"
143
196
" args"
144
197
" (procedure-environment proc)"
145
- " \"doh! analysis\")))"
198
+ " \"doh! amb analysis\")"
199
+ " succeed"
200
+ " fail))"
146
201
" (else"
147
202
" (error"
148
203
" \"Unknown procedure type -- EXECUTE-APPLICATION\""
149
204
" proc))))" ,
150
205
ambenv );
151
- evalstr ("(define (analyze-time exp)"
152
- " (let ((proc (analyze (timed-expr exp))))"
153
- " (lambda (env)"
154
- " (time (proc env)))))" ,
155
- ambenv );
206
+
207
+ // evalstr("(define (analyze-apply exp)"
208
+ // " (let ((fproc (analyze (apply-operator exp)))"
209
+ // " (argsproc (analyze (apply-operands exp))))"
210
+ // " (lambda (env)"
211
+ // " (execute-application (fproc env)"
212
+ // " (argsproc env)))))",
213
+ // ambenv);
214
+ // evalstr("(define (analyze-application exp)"
215
+ // " (let ((fproc (analyze (operator exp)))"
216
+ // " (aprocs (map analyze (operands exp))))"
217
+ // " (lambda (env)"
218
+ // " (execute-application (fproc env)"
219
+ // " (map (lambda (aproc) (aproc env))"
220
+ // " aprocs)))))",
221
+ // ambenv);
156
222
}
157
223
158
224
static obj ambeval (obj exp , obj exenv , obj succeed , obj fail )
159
225
{
160
- (void )succeed , (void )fail ;
226
+ // (void)succeed, (void)fail;
161
227
162
228
static bool haveinit = false;
163
229
@@ -176,7 +242,9 @@ static obj ambeval(obj exp, obj exenv, obj succeed, obj fail)
176
242
disable_gc = orig_gc ;
177
243
178
244
obj analyze_execute =
179
- cons (list2 (quote , analyzed ), list1 (list2 (quote , exenv )));
245
+ cons (list2 (quote , analyzed ),
246
+ list3 (list2 (quote , exenv ), list2 (quote , succeed ),
247
+ list2 (quote , fail )));
180
248
181
249
return eceval (analyze_execute , exenv );
182
250
}
0 commit comments