[racket-dev] patch for make-base-eval

From: Ryan Culpepper (ryanc at ccs.neu.edu)
Date: Wed Oct 2 16:09:03 EDT 2013

No, the 'racket/pretty' module might be declared even if the symbol 
isn't defined (or "mapped") in the namespace:

   > (define ns (make-base-namespace))
   > (define repl-ns (current-namespace))
   > (parameterize ((current-namespace ns))
       (eval '(require (only-in racket/pretty))))
   > (parameterize ((current-namespace ns))
       (namespace-attach-module repl-ns 'racket/pretty))
   namespace-attach-module: a different module with the same name is
   already in the destination namespace
     module name: "/opt/racket-5.3.6/collects/racket/pretty.rkt"
     context...:
      /opt/racket-5.3.6/collects/racket/private/misc.rkt:87:7

And the symbol can be defined in the namespace even if the module is not 
declared:

   > (define ns (make-base-namespace))
   > (define repl-ns (current-namespace))
   > (parameterize ((current-namespace ns))
       (eval '(define pretty-print-handler #t)))
   > (parameterize ((current-namespace ns))
       (namespace-variable-value 'pretty-print-handler))
   #t
   ;; but racket/pretty is not declared,
   ;; and #t is not a good print handler

Ryan


On 10/02/2013 03:58 PM, Stephen Chang wrote:
>> A namespace is a mapping from top-level identifiers to whatever they are, as
>> well as a separate mapping from module names to modules (roughly). What you
>> care about here is the second mapping, but you're checking the first with
>> the patch.
>
> Thanks for the explanation. That helps a lot. So the danger with my
> check is when someone has another definition of pretty-print handler
> but racket/pretty has not been attached?
>
> But given the context, ie the dynamic require on the next line, it
> seems like there's already an assumption about what the identifier I'm
> checking is, so in this specific situation, isnt my check sufficient?
>
>
>
>>
>> Robby
>>
>>
>> On Wed, Oct 2, 2013 at 2:45 PM, Stephen Chang <stchang at ccs.neu.edu> wrote:
>>>
>>>> Whether that identifier exists in the namespace has nothing to do with
>>>> whether racket/pretty can be attached.
>>>
>>> Can you explain this a little more because it's a little unintuitive to
>>> me?
>>>
>>>
>>>>
>>>> One option would be for install-pretty-printer! to just catch and
>>>> discard
>>>> the error. Evaluators for some languages would mysteriously not have
>>>> pretty-printing turned on by default.
>>>>
>>>> Another option would be to attach racket/pretty before requiring the
>>>> initial
>>>> language for the namespace.
>>>>
>>>> Another option is use #:pretty-print? #f when attaching racket/pretty
>>>> would
>>>> fail.
>>>>
>>>> Ryan
>>>>
>>> _________________________
>>>    Racket Developers list:
>>>    http://lists.racket-lang.org/dev
>>
>>


Posted on the dev mailing list.