Opened 10 years ago

Closed 8 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


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 sjamaan

Estimated difficulty: hard

comment:2 Changed 8 months ago by felix winkelmann

Milestone: someday6.0.0

comment:3 Changed 8 months ago by felix winkelmann


comment:4 Changed 8 months ago by sjamaan

Resolution: fixed
Status: newclosed

Fixed with 75c0461c8b541a3b03e337e7546ce3b0ea4e6931

Note: See TracTickets for help on using tickets.