[racket-dev] patch for make-base-eval
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
>>
>>