Opened 11 years ago
Closed 14 months ago
#1132 closed defect (fixed)
Expansion of internal definitions ignores import status/redefinition of `define` et al.
Reported by: | evhan | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | 5.4 |
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.
Change History (4)
comment:1 Changed 8 years ago by
Estimated difficulty: | → hard |
---|
comment:2 Changed 14 months ago by
Milestone: | someday → 6.0.0 |
---|
comment:3 Changed 14 months ago by
Milestone: | 6.0.0 → 5.4 |
---|
comment:4 Changed 14 months ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
Note: See
TracTickets for help on using
tickets.
Fixed with 75c0461c8b541a3b03e337e7546ce3b0ea4e6931