As far as I can tell a namespace knows if an identifier is defined directly
in the module or if it is imported.
If map? is #t then, imported identifiers are handled - and if map? is #f
then only identifiers defined directly in the module is handled. Since
namespace-undefined-variable! has no map? argument, you can't undefine
imported variables.

Why the map? argument is missing from namespace-undefined-variable! I don't
know

/Jens Axel


2015-08-27 19:24 GMT+02:00 Jos Koot <[email protected]>:

> Thanks for your prompt and clear reply.
> I admit I don't fully understand the map? argument.
> Just by trying out I know that for my purposes I always have to provide
> true for the map? argument.
> Meanwhile I insert the namespace-set-variable-value! line with true map?
> argument, as you suggest.
> Thanks again,
> Jos
>
> ------------------------------
> *From:* [email protected] [mailto:[email protected]] *On
> Behalf Of *Jens Axel Søgaard
> *Sent:* jueves, 27 de agosto de 2015 17:35
> *To:* Jos Koot
> *Cc:* Racket-Users List
> *Subject:* Re: [racket-users] namespace-undefine-variable! question
>
> The issue here is whether the namespance's identifier mapping is used or
> not.
>
> The documentation for namespace-undefine-variable! says:
>
>     Removes the sym variable, if any, in the top-level environment of
> namespace in
>     its base phase. The namespace’s identifier mapping (see Namespaces) is
>      unaffected.
>
> We can see that  list  is use the identifier mapping by changing the
> second argument of namespace-variable-value to #f.
>
>     #lang racket
>     (define ns (make-base-namespace))
>     (namespace-variable-value 'list #f (λ () 'not-found) ns)
>
> which evaluates to 'not-found.
>
> Inserting your own non-imported value for  list  makes the identifier
> non-imported and has
> the happy side-effect of making namespace-undefined-variable! capable of
> removing the
> binding from namespace.
>
> In some sense  namespace-undefined-variable!  miss an map? argument.
> Your solution: insert, then undefine  seem to be the best solution for now.
>
> /Jens Axel
>
> you n
>
>
> 2015-08-27 16:53 GMT+02:00 Jos Koot <[email protected]>:
>
>> The following works:
>>
>> #lang racket/base
>> #;1 (define ns (make-base-namespace))
>> #;2 (namespace-variable-value 'list #t (λ () 'not-found) ns)
>> ; -> #<procedure:print-syntax-width>
>> #;3 (namespace-set-variable-value! 'list 'whatever (λ () #f) ns)
>> #;4 (namespace-undefine-variable! 'list ns)
>> #;5 (namespace-variable-value 'list#t (λ () 'not-found) ns)
>> ; -> not-found
>>
>> But when I omit line 3 it does not work:
>>
>> #lang racket/base
>> #;1 (define ns (make-base-namespace))
>> #;2 (namespace-variable-value 'list #t (λ () 'not-found) ns) ; ->
>> #<procedure:list>
>> #;4 (namespace-undefine-variable! 'list ns)
>> ;-> error namespace-undefine-variable!: given name is not defined
>> ;       name: list
>>
>> This I did with: Welcome to DrRacket, version
>> 6.2.0.5--2015-07-06(d6fa581/a) [3m].
>> Code in the definitions window. The problem is not typical for 'list
>> only.
>> The same happens with (at least some) other variables of a base-namespace.
>>
>> I have no clue why commenting out line 3 gives an error.
>> Do I misinterpret the docs on namespaces?
>>
>> Thanks, Jos
>>
>> PS I use a base-namespace in a toy interpreter.
>> It allows me to easily borrow all variables from a base-namespace.
>> But some of them I want to undefine.
>>
>>
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Racket Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
>
> --
> --
> Jens Axel Søgaard
>
>


-- 
-- 
Jens Axel Søgaard

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to