|
5 | 5 | static obj condense_body(obj es) { |
6 | 6 | if (Mnullp(Mcdr(es))) { |
7 | 7 | // single expression => just use expression |
8 | | - return expand_expr(Mcar(es)); |
| 8 | + return Mcar(es); |
9 | 9 | } else { |
10 | 10 | // multiple expressions => wrap in begin |
11 | | - return expand_expr(Mcons(Mbegin_symbol, es)); |
| 11 | + return Mcons(Mbegin_symbol, es); |
12 | 12 | } |
13 | 13 | } |
14 | 14 |
|
@@ -46,7 +46,7 @@ static obj expand_let_values_expr(obj e) { |
46 | 46 | tl = Mcdr(tl); |
47 | 47 | } |
48 | 48 |
|
49 | | - return Mlist3(Mlet_values_symbol, hd, condense_body(Mcddr(e))); |
| 49 | + return Mlist3(Mlet_values_symbol, hd, expand_expr(condense_body(Mcddr(e)))); |
50 | 50 | } |
51 | 51 |
|
52 | 52 | // ([(<id> ...) <expr>] ...) |
@@ -265,29 +265,31 @@ obj expand_expr(obj e) { |
265 | 265 | if (Msymbolp(Mcadr(e))) { |
266 | 266 | // named let => convert to letrec |
267 | 267 | e = expand_let_loop(e); |
268 | | - goto loop; |
269 | 268 | } else if (Mnullp(Mcadr(e))) { |
270 | 269 | // empty bindings => just use body |
271 | | - return condense_body(Mcddr(e)); |
| 270 | + e = condense_body(Mcddr(e)); |
272 | 271 | } else { |
273 | 272 | // at least one binding |
274 | | - e = expand_let_expr(e); |
275 | | - goto loop; |
| 273 | + e = expand_let_expr(e); |
276 | 274 | } |
| 275 | + |
| 276 | + goto loop; |
277 | 277 | } else if (hd == Mletrec_symbol) { |
278 | 278 | // letrec => transforms to let |
279 | 279 | if (Mnullp(Mcadr(e))) { |
280 | 280 | // empty bindings => just use body |
281 | | - return condense_body(Mcddr(e)); |
| 281 | + e = condense_body(Mcddr(e)); |
282 | 282 | } else { |
283 | 283 | // at least one binding |
284 | 284 | e = expand_letrec_expr(e); |
285 | | - goto loop; |
286 | 285 | } |
| 286 | + |
| 287 | + goto loop; |
287 | 288 | } else if (hd == Mlet_values_symbol) { |
288 | 289 | if (Mnullp(Mcadr(e))) { |
289 | 290 | // empty bindings => just use body |
290 | | - return condense_body(Mcddr(e)); |
| 291 | + e = condense_body(Mcddr(e)); |
| 292 | + goto loop; |
291 | 293 | } else { |
292 | 294 | // at least one binding |
293 | 295 | return expand_let_values_expr(e); |
@@ -327,19 +329,11 @@ obj expand_expr(obj e) { |
327 | 329 | expand_expr(Mcar(Mcdddr(e))) |
328 | 330 | ); |
329 | 331 | } else if (hd == Mwhen_symbol) { |
330 | | - return Mlist4( |
331 | | - Mif_symbol, |
332 | | - expand_expr(Mcadr(e)), |
333 | | - expand_expr(Mcons(Mbegin_symbol, Mcddr(e))), |
334 | | - Mlist2(Mquote_symbol, Mvoid) |
335 | | - ); |
| 332 | + e = Mlist4(Mif_symbol, Mcadr(e), Mcons(Mbegin_symbol, Mcddr(e)), Mlist2(Mquote_symbol, Mvoid)); |
| 333 | + goto loop; |
336 | 334 | } else if (hd == Munless_symbol) { |
337 | | - return Mlist4( |
338 | | - Mif_symbol, |
339 | | - expand_expr(Mcadr(e)), |
340 | | - Mlist2(Mquote_symbol, Mvoid), |
341 | | - expand_expr(Mcons(Mbegin_symbol, Mcddr(e))) |
342 | | - ); |
| 335 | + e = Mlist4(Mif_symbol, Mcadr(e), Mlist2(Mquote_symbol, Mvoid), Mcons(Mbegin_symbol, Mcddr(e))); |
| 336 | + goto loop; |
343 | 337 | } else if (hd == Mcond_symbol) { |
344 | 338 | if (Mnullp(Mcdr(e))) { |
345 | 339 | // empty cond => void |
@@ -374,7 +368,7 @@ obj expand_expr(obj e) { |
374 | 368 | goto loop; |
375 | 369 | } |
376 | 370 | } else if (hd == Mlambda_symbol) { |
377 | | - return Mlist3(Mlambda_symbol, Mcadr(e), condense_body(Mcddr(e))); |
| 371 | + return Mlist3(Mlambda_symbol, Mcadr(e), expand_expr(condense_body(Mcddr(e)))); |
378 | 372 | } else if (hd == Msetb_symbol) { |
379 | 373 | return Mlist3(Msetb_symbol, Mcadr(e), expand_expr(Mcaddr(e))); |
380 | 374 | } else if (hd == Mquote_symbol) { |
|
0 commit comments