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.

