I am wrong, there was a bug here, and Rich just fixed it. https://github.com/clojure/clojure/commit/8225407032ea643cbe3db7f35ef97b1230fc65b8
Please retry against master, and sorry for inflicting more confusion. Stu > Meikel, > > while a good description of how things work in 1.2, it's not accurate for > 1.3, and my point was that Stu's description of how 1.3 works (by using words > like "the function is recompiled") does not match with my own knowledge of > what had been done in 1.3 the days just before the conj. > > Since then, I've been away from #clojure (to my regret) and maybe I've missed > new evolutions on the way it's handled in master. > > Anyway, this concept of "the function is recompiled" feels "weird". > > My own comprehension of how things work in 1.3: > > Each function works through a cached set of var's values, and there's just a > check to see if the cache is stale or not. If the cache is stale (some vars > have been redef's, e.g. their root value has been changed), then the cache is > recomputed. > > > 2010/11/17 Meikel Brandmeyer <m...@kotka.de> > Hi, > > On 17 Nov., 16:29, David Sletten <da...@bosatsu.net> wrote: > > > > => (defn a > > > ([x] x) > > > ([x y] (+ (a x) (a y)))) > > > #'user/a > > > => (a 1 2) > > > 3 > > > => (def b a) > > > #'user/b > > > => (b 1 2) > > > 3 > > > => (defn a [x] > > > (- x)) > > > #'user/a > > > => (b 1 2) > > > -3 > > > > Let's call the original function assigned to 'a' a0 and the new one a1. > > After 'a' has been redefined to a1, 'b' still refers to a0. So the 2nd call > > to 'b' invokes a0 with two args (in fact, a1 only takes one arg now). But > > within a0 itself the references to 'a' are being resolved at runtime to a1 > > now, not as references to a0 as before. > > > > Are you saying that inside a0 Clojure detects that 'a' means something else > > now and recompiles a0 to point to a1? > > > > In any case, this behavior seems weird. > > Isn't that completely logical? Let's name things differently to keep > functions and Vars apart. You define a function f and store it in Var > a. f references Var a internally. Then you define Var b and store f in > it by retrieving it from Var a. By executing (b 1 2) you basically > retrieve f from b and call it with two arguments. Inside f, f itself > is retrieved from the Var a and called with one argument. > > Now you create a new function g, which you store in Var a (assumption: > re-defing an existing Var just replaces its value and does not unmap > and map again a fresh Var). Again you execute (b 1 2). Same thing > happens: f is retrieved and called with two arguments. Inside f > however, now g is retrieved from Var a and called with one argument. > > This actually allows to define memoized recursive functions. > > Sincerely > Meikel > > -- > 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 > > > -- > 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 -- 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