Opened 9 years ago
Last modified 7 years ago
#1132 new defect
Expansion of internal definitions ignores import status/redefinition of `define` et al.
Reported by: | evhan | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | someday |
Component: | expander | Version: | 4.9.x |
Keywords: | expander, syntax, define | Cc: | |
Estimated difficulty: | hard |
Description
Forms starting with define
, define-values
and define-syntax
are expanded as internal definitions in let and lambda bodies regardless of whether those identifiers have been imported or redefined to some other transformer.
With redefinition:
(define-syntax define (syntax-rules () ((_ . a) (list . a)))) ;; Works, gives (1 2 3). (define 1 2 3) ;; Works, prints (1 2 3), since the define isn't treated ;; as an internal definition. (let () (display (define 1 2 3))) ;; Fails, errors since the define is treated as an internal ;; definition when it should instead return a list. (let () (define 1 2 3))
Without having been imported:
;; Works, errors due to define being unbound. (module foo () (import (except scheme define)) (define a 1)) ;; Fails, should error due to define being unbound but doesn't. (module foo () (import (except scheme define)) (let () (define a 1)))
The same applies for define-values
and define-syntax
.
Bindings introduced by let
, let-syntax
and friends are handled correctly.
Note: See
TracTickets for help on using
tickets.