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:
parent
9c51370e51
commit
079f46fbc1
|
@ -393,15 +393,30 @@
|
|||
(eval (eval '(def)))
|
||||
(test 1 eval '(ref)))
|
||||
|
||||
#|
|
||||
(define-syntax-rule (m3 c-id)
|
||||
(begin
|
||||
(define-syntax plus #f)
|
||||
(define (c-id) (compile #'(define plus plus)))))
|
||||
;; 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))))))
|
||||
(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))))
|
||||
|
||||
;; ----------------------------------------
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user