At Thu, 17 Nov 2011 21:10:29 -0500, Harry Spier wrote: > Dear list members, > > While playing around with Racket in DrRacket, I accidently entered in the > interactions window. > > (define x 7) > > (define x 8) > > and DrRacket allowed it, i.e. I didn't get a "duplicate definition of > identifiers error message.
REPL interactions --- and namespace-based evaluation in general --- allow redefinitions, as long as a redefinition doesn't conflict with the constantness of a binding. This "top-level" behavior is traditional in Lisps, and it is useful for certain exploration and development styles, so Racket supports it where practical. > So to try and figure out what was going onI then entered this in the > definitions window of DrRacket:: > *Code snippet A* > (define-namespace-anchor a) > (define ns (namespace-anchor->namespace a)) > (eval '(begin (define x 7) (define x 8)) ns) > (eval 'x ns) > > and still no "duplicate definitions error". A top-level definition is never treated as a constant definition, so that's why you can redefine `x' in this example. > I then tried this: > *Code snippet B* > (define x 9) > (define-namespace-anchor a) > (define ns (namespace-anchor->namespace a)) > (eval '(begin (define x 7) (define x 8)) ns) > (eval 'x ns) > > and I got the error message: "cannot redefine a constant x".. The `(define x 9)' within the module in this case makes `x' a constant (since `x' is not `set!'ed within the body of the module), so you cannot redefine `x' in this case. Note that the `(define x 7)' fails, even before `(define x 8)'. _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users