Great answer Alex. Thanks!

Morten

On Nov 12, 12:34 am, Alex Osborne <a...@meshy.org> wrote:
> mbrodersen wrote:
> > In this simple recursive expression:
>
> > (def t (fn [x] (if (zero? x) 0 (+ x (t (dec x))))))
>
> > The fn special form is evaluated within a context where t is not yet
> > bound.
>
> > t is only bound AFTER fn has captured its environment.
>
> > In other words, the closure captured by fn doesn't know anything about
> > t (or maybe only that t is unbound).
>
> > And yet it still works if I call t:
>
> > (t 5) => 15
>
> > My question is how Clojure ensures that t is bound to the closure
> > after the closure has already been captured?
>
> t is a var.  The var is created before the body of def is evaluated.  At
> that point it is unbound.  The function closes over the var not the
> value of the binding.  That's why you can re-evaluate a function,
> changing it's behaviour, without having to re-evaluate everything that
> calls it.
>
> You'll notice that with locals (which aren't vars, they're immutable) it
> doesn't work:
>
> (let [t (fn [x] (if (zero? x) 0 (+ x (t (dec x)))))] (t 2))
>
> Also if you try to use the var in the bindings you'll get an unbound
> error, not an unable to resolve symbol error:
>
> (def foo foo)

-- 
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