diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl index 0208642db7..1ad68a9665 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl @@ -1021,6 +1021,35 @@ (begin (read) (+ z z)))) +(test-comp '(lambda (g z) + (let ([get (lambda () + (begin + (read) + (lambda (x) (+ z z))))]) + ((get) g))) + '(lambda (g z) + (begin + (read) + (+ z z)))) +(test-comp '(lambda () + (let ([a (display "a")] + [g (lambda (x) x)]) + (list + ((begin + (display "b") + g) + a) + g + g))) + '(lambda () + (let ([a (display "a")] + [g (lambda (x) x)]) + (list + (begin + (display "b") + a) + g + g)))) (test-comp '(lambda (w z) (let ([x (cons w z)]) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 83f6ebb665..59e6fbd21c 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -2161,6 +2161,16 @@ static Scheme_Object *check_app_let_rator(Scheme_Object *app, Scheme_Object *rat return scheme_optimize_expr((Scheme_Object *)head, info, context); } + /* Convert ((begin .... E) arg ...) to (begin .... (E arg ...)). */ + if (SAME_TYPE(SCHEME_TYPE(rator), scheme_sequence_type)) { + Scheme_Sequence *seq = (Scheme_Sequence *)rator; + + reset_rator(app, seq->array[seq->count - 1]); + seq->array[seq->count-1] = app; + + return scheme_optimize_expr((Scheme_Object *)seq, info, context); + } + return NULL; }