Hi Alex,

I understand exactly why this situation exists.  I just think the
behavior is unexpected.  When I create a function with a dynamic
binding, I expect the function to keep a reference to the *name*, not
the var that the name resolves to at compile/clinit time.  Using with-
bindings* seems terribly unsupported as well.

I guess the question is:  what do other people expect?  Am I alone in
thinking that this is unexpected and undesirable?

Thanks,
Alyssa Kwan

On Nov 17, 3:04 am, Alex Osborne <a...@meshy.org> wrote:
> Hi Alyssa,
>
> Alyssa Kwan <alyssa.c.k...@gmail.com> writes:
> > ns-unmap isn't typically used.  But for durability, we can think of
> > JVM shutdown/startup as unmapping everything and starting fresh.
> > Therefore, expected behavior for ns-unmap should be the same as
> > behavior for deserializing and loading an object after a new JVM
> > startup.
>
> I think the point that you're missing is that vars are just plain old
> first class objects.  This includes being managed by the garbage
> collector so they'll continue to exist until all references to them are
> released.  You can pass them around, put them in vectors etc.
>
> >  Here's another issue I ran into:
>
> > => (def a 1)
> > #'user/a
>
> > => (defn b [] a)
> > #'user/b
>
> When you compile this, a reference to the var #'user/a is embedded in
> your b function.  This reference is directly to the var object.
>
> > So far so good...
>
> > => (ns-unmap *ns* 'a)
> > nil
>
> > => a
> > java.lang.Exception: Unable to resolve symbol: a in this context
>
> > => (b)
> > 2
>
> The var has been unmapped from the namespace, but it still exists
> because the function b has a reference to it.  Vars don't need to live
> in a namespace.  For example, the "with-local-vars" macro creates a
> "local" var which doesn't belong to a namespace.
>
>
>
> > => (binding [a 3]
> >      (b))
> > java.lang.Exception: Unable to resolve var: a in this context
> > So what's the expected behavior here?  I would think that after a is
> > unmapped, b should no longer work.  Instead, it's hanging onto a with
> > the last value.
>
> The var still exists, b holds a reference to it.
>
> > And the binding form doesn't work anymore, so there's
> > no way to dynamically bind over it.  It's like a weird hybrid of
> > lexical and dynamic binding...
>
> The only reason this is erroring is that the symbol 'a can no longer be
> mapped to your var.
>
> Actually there is a way to dynamically bind over a var which has been
> unmapped, all you need is a reference to it:
>
> user> (def a 1)
> #'user/a
> user> (def my-a #'user/a)
> #'user/my-a
> user> (defn b [] a)
> #'user/b
> user> (ns-unmap *ns* 'a)
> nil
> user> (b)
> 1
> user> (with-bindings* {my-a 30} #(b))
> 30

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to