[racket] Question about resolution of variable-name conflicts in namespaces

From: Matthew Butterick (mb.list.acct at gmail.com)
Date: Wed May 15 11:43:21 EDT 2013

Probably more products should have an FHQ (Frequently Hopeless Questions)
in addition to an FAQ.

I'm making a web-page generator that uses include-template from
web-server/templates. I need to set the template inputs & the template
itself at runtime, and collect the output.

I tried doing it with module and module* but I didn't see how to make the
data go round-trip. A submodule with include-template could require the
needed data from the enclosing module, but then the enclosing module can't
require the submodule to get the result, so ... ? I could well be
overlooking an obvious technique.

My original solution was to write a new file and send it through the Racket
executable as a system command. (This worked, slowly.)

So that's how I ended up using eval. Which does work, now that I've
retooled how I set up the namespace.


On Tue, May 14, 2013 at 5:13 PM, Robby Findler
<robby at eecs.northwestern.edu>wrote:

> The short answer is that the top-level is hopeless, as Matthew has
> discussed at some length here and elsewhere.
>
> If you really need to eval code, can you first put it into a module?
>
> Robby
>
>
> On Tue, May 14, 2013 at 11:09 AM, Matthew Butterick <
> mb.list.acct at gmail.com> wrote:
>
>> Suppose x-is-foo.rkt is this:
>>
>> (module x-is-foo racket
>>   (define x 'foo)
>>   (provide x))
>>
>> If you open another file and try this:
>>
>> (require "x-is-foo.rkt")
>> (define x 'bar)
>>
>> You'lll get a "identifier already imported" error. OK, that much I
>> understand.
>>
>> Here's the question. When you do this:
>>
>> (parameterize ([current-namespace (make-base-empty-namespace)])
>>   (namespace-require 'racket)
>>   (namespace-require "x-is-foo.rkt")
>>   (namespace-set-variable-value! 'x 'bar)
>>   (eval '(print x) (current-namespace)))
>>
>> This time, you get 'foo. Why 'foo? Why not another "identifier already
>> imported" error?
>>
>> I assume I'm missing a subtlety of how the namespace environment is
>> different. But according to the docs, both namespace-require and
>> namespace-set-variable-value! affect the top-level environment of the
>> namespace. So I don't see why the require is silently overriding the
>> set-variable-value, rather than causing a conflict.
>>
>> It's not a sequencing issue, because if you swap the two lines:
>>
>> (parameterize ([current-namespace (make-base-empty-namespace)])
>>   (namespace-require 'racket)
>>   (namespace-set-variable-value! 'x 'bar)
>>   (namespace-require "x-is-foo.rkt")
>>   (eval '(print x) (current-namespace)))
>>
>> You still get 'foo.
>>
>> Only if you remove the require line:
>>
>> (parameterize ([current-namespace (make-base-empty-namespace)])
>>   (namespace-require 'racket)
>>   (namespace-set-variable-value! 'x 'bar)
>>   (eval '(print x) (current-namespace)))
>>
>> Do you get 'bar.
>>
>>
>>
>> ____________________
>>   Racket Users list:
>>   http://lists.racket-lang.org/users
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20130515/6c262b30/attachment-0001.html>

Posted on the users mailing list.