From 17c802c2e151c4f8439e6fa62cd25cadfb72297a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 21 Dec 2010 06:30:31 -0700 Subject: [PATCH] compiler: (let ([x (begin M ... N)]) P) => (begin M ... (let ([x N]) P)) --- src/racket/src/syntax.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/racket/src/syntax.c b/src/racket/src/syntax.c index c5cd09d620..25c98dc843 100644 --- a/src/racket/src/syntax.c +++ b/src/racket/src/syntax.c @@ -3183,7 +3183,8 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i int try_again; do { try_again = 0; - /* (let ([x (let~ ([y M]) N)]) P) => (let~ ([y M]) (let ([x N]) P)) */ + /* (let ([x (let~ ([y M]) N)]) P) => (let~ ([y M]) (let ([x N]) P)) + or (let ([x (begin M ... N)]) P) => (begin M ... (let ([x N]) P)) */ if (post_bind) { if (head->num_clauses == 1) { clv = (Scheme_Compiled_Let_Value *)head->body; /* ([x ...]) */ @@ -3214,6 +3215,13 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i post_bind = !(SCHEME_LET_FLAGS(head) & (SCHEME_LET_RECURSIVE | SCHEME_LET_STAR)); try_again = 1; } + } else if (SAME_TYPE(SCHEME_TYPE(clv->value), scheme_sequence_type)) { + Scheme_Sequence *seq = (Scheme_Sequence *)clv->value; /* (begin M ... N) */ + + clv->value = seq->array[seq->count - 1]; + seq->array[seq->count - 1] = (Scheme_Object *)head; + + return scheme_optimize_expr((Scheme_Object *)seq, info, context); } } }