Opened 3 years ago

Last modified 13 months 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


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 (1)

comment:1 Changed 13 months ago by sjamaan

  • Estimated difficulty set to hard
Note: See TracTickets for help on using tickets.