expander: treat unbound and top-level-bound as free-identifier=?

Restores quetionable but traditional behavior.
This commit is contained in:
Matthew Flatt 2018-03-09 16:07:37 -07:00
parent 35dc59ee07
commit 0d06ba2848
3 changed files with 7582 additions and 7546 deletions

View File

@ -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

View File

@ -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