fix internal-definition expansion

The code added to handle expressions mixed with definitions was
not introduced in the right way; fix it to be like macro-introduced
code.

Closes PR 13452
This commit is contained in:
Matthew Flatt 2013-01-25 05:07:33 -07:00
parent 79266fcf36
commit 9210437b3f
2 changed files with 24 additions and 1 deletions

View File

@ -1752,6 +1752,25 @@
(syntax-test #'(letrec) #rx"missing binding")
(syntax-test #'(letrec ([x 3])) #rx"missing body")
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Check that expansion generated for internal definitions
;; introduces `values' and `begin' as if by macros:
(let ()
(define (int-def-check)
(define (values) (error 'hygiene "is broken"))
1 ; expansion uses `values' and `begin'
(define x 2)
3)
(test 3 int-def-check)
(define (int-def-check2)
(define (begin) (error 'hygiene "is broken"))
1
(define x 2)
30)
(test 30 int-def-check2))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(report-errs)

View File

@ -5624,18 +5624,22 @@ compile_expand_block(Scheme_Object *forms, Scheme_Comp_Env *env,
int cnt;
if (!SCHEME_NULLP(pre_exprs)) {
Scheme_Object *begin_stx, *values_app_stx;
Scheme_Object *begin_stx, *values_app_stx, *exp_mark;
pre_exprs = scheme_reverse(pre_exprs);
exp_mark = scheme_new_mark();
begin_stx = scheme_datum_to_syntax(begin_symbol,
scheme_false,
scheme_sys_wraps(env),
0, 0);
begin_stx = scheme_add_remove_mark(begin_stx, exp_mark);
values_app_stx = scheme_datum_to_syntax(scheme_make_pair(values_symbol, scheme_null),
scheme_false,
scheme_sys_wraps(env),
0, 0);
values_app_stx = scheme_add_remove_mark(values_app_stx, exp_mark);
while (SCHEME_PAIRP(pre_exprs)) {
v = scheme_make_pair(scheme_null,