expander: treat unbound and top-level-bound as free-identifier=?
Restores quetionable but traditional behavior.
This commit is contained in:
parent
35dc59ee07
commit
0d06ba2848
|
@ -1692,6 +1692,20 @@
|
|||
(require (for-meta 4 racket/base))
|
||||
(test #t free-identifier=? #'lambda #'lambda 0 4)
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Unbound and bound at toplevel are equivalent by `free-identifier=?`
|
||||
|
||||
(test #t free-identifier=? #'defined-at-the-top-level (datum->syntax #f 'defined-at-the-top-level))
|
||||
(define defined-at-the-top-level 'yep)
|
||||
(test #t free-identifier=? #'defined-at-the-top-level (datum->syntax #f 'defined-at-the-top-level))
|
||||
|
||||
(define-syntax-rule (define-defined-at-the-top-level)
|
||||
(begin
|
||||
(define defined-at-the-top-level 10)
|
||||
(test #f free-identifier=? #'defined-at-the-top-level (datum->syntax #f 'defined-at-the-top-level))))
|
||||
(define-defined-at-the-top-level)
|
||||
(test #t free-identifier=? #'defined-at-the-top-level (datum->syntax #f 'defined-at-the-top-level))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; certification example from the manual
|
||||
|
||||
|
|
|
@ -43,14 +43,20 @@
|
|||
;; ----------------------------------------
|
||||
|
||||
(define (free-identifier=? a b a-phase b-phase)
|
||||
(define ab (resolve+shift a a-phase #:unbound-sym? #t))
|
||||
(define bb (resolve+shift b b-phase #:unbound-sym? #t))
|
||||
(define ab (toplevel-as-symbol (resolve+shift a a-phase #:unbound-sym? #t)))
|
||||
(define bb (toplevel-as-symbol (resolve+shift b b-phase #:unbound-sym? #t)))
|
||||
(cond
|
||||
[(or (symbol? ab) (symbol? bb))
|
||||
(eq? ab bb)]
|
||||
[else
|
||||
(same-binding? ab bb)]))
|
||||
|
||||
(define (toplevel-as-symbol b)
|
||||
(if (and (module-binding? b)
|
||||
(top-level-module-path-index? (module-binding-module b)))
|
||||
(module-binding-sym b)
|
||||
b))
|
||||
|
||||
(define (same-binding? ab bb)
|
||||
(cond
|
||||
[(module-binding? ab)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user