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)))
|
(eval (eval '(def)))
|
||||||
(test 1 eval '(ref)))
|
(test 1 eval '(ref)))
|
||||||
|
|
||||||
#|
|
;; When a binding is present, it takes precedence over
|
||||||
(define-syntax-rule (m3 c-id)
|
;; a "temporary" binding:
|
||||||
(begin
|
(parameterize ([current-namespace (make-base-namespace)])
|
||||||
(define-syntax plus #f)
|
(eval '(require (for-syntax racket/base)))
|
||||||
(define (c-id) (compile #'(define plus plus)))))
|
(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)
|
;; A "temporary" binding should work on an identifier with
|
||||||
(cdef)
|
;; 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;
|
*_menv = genv;
|
||||||
|
|
||||||
if (SCHEME_STXP(find_id)) {
|
if (SCHEME_STXP(find_id)) {
|
||||||
if (flags & SCHEME_NULL_FOR_UNBOUND)
|
|
||||||
return NULL;
|
|
||||||
find_global_id = scheme_future_global_binding(find_id, env->genv);
|
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
|
} else
|
||||||
find_global_id = find_id;
|
find_global_id = find_id;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user