adjust top-level handling for identifiers without #%top

Refine the changes in 16c198805b so that `(define id ... id ... )` at
the top level compiles more consistently when `id` is an identifier
whose lexical context does not include `#%top`.
This commit is contained in:
Matthew Flatt 2015-09-06 07:59:50 -06:00
parent 9c51370e51
commit 079f46fbc1
2 changed files with 33 additions and 10 deletions

View File

@ -393,15 +393,30 @@
(eval (eval '(def)))
(test 1 eval '(ref)))
#|
(define-syntax-rule (m3 c-id)
;; When a binding is present, it takes precedence over
;; a "temporary" binding:
(parameterize ([current-namespace (make-base-namespace)])
(eval '(require (for-syntax racket/base)))
(eval '(define-syntax-rule (m3 c-id)
(begin
(define-syntax plus #f)
(define (c-id) (compile #'(define plus plus)))))
(define (c-id) (compile #'(define plus plus))))))
(eval '(m3 cdef))
(err/rt-test (eval '(cdef)) exn:fail:syntax?))
(m3 cdef)
(cdef)
|#
;; A "temporary" binding should work on an identifier with
;; no `#%top` in its context:
(parameterize ([current-namespace (make-base-namespace)])
(eval '(require (for-syntax racket/base)))
(eval '(define-syntax (m3 stx)
(with-syntax ([(gen) (generate-temporaries '(gen))])
(syntax-case stx ()
[(_ id)
#'(begin
(define (gen) gen)
(define id gen))]))))
(eval '(m3 self))
(test #t eval '(eq? self (self))))
;; ----------------------------------------

View File

@ -1443,9 +1443,17 @@ scheme_compile_lookup(Scheme_Object *find_id, Scheme_Comp_Env *env, int flags,
*_menv = genv;
if (SCHEME_STXP(find_id)) {
if (flags & SCHEME_NULL_FOR_UNBOUND)
return NULL;
find_global_id = scheme_future_global_binding(find_id, env->genv);
if (!SAME_OBJ(find_global_id, SCHEME_STX_VAL(find_id))
&& SCHEME_FALSEP(binding)) {
/* Since we got a symbol back, there's at least a "temporary"
top-level binding for the identifier in the current namespace */
binding = scheme_make_vector(3, NULL);
SCHEME_VEC_ELS(binding)[0] = find_global_id;
SCHEME_VEC_ELS(binding)[1] = (env->genv->module ? env->genv->module->modname : scheme_false);
SCHEME_VEC_ELS(binding)[2] = scheme_env_phase(env->genv);
} else if (flags & SCHEME_NULL_FOR_UNBOUND)
return NULL;
} else
find_global_id = find_id;