Ah, I see. :) Thanks for your quick reply.
Vincent On May 11, 8:54 pm, Rich Hickey <[email protected]> wrote: > On May 11, 2:20 pm, Vincent Akkermans <[email protected]> > wrote: > > > > > Hi all, > > > I'm building an application in which I want some function calls to be > > logged. However, when I have function A and B (both will be logged) > > and A is called from B, I want the log to show this relation. I > > defined a small macro for this purpose: > > > (def *hierarchy* []) > > (def *action-id* nil) > > > (defn action-id [] > > (if (nil? *action-id*) > > (gensym "action-") > > *action-id*)) > > > (defmacro defalgo [name args & body] > > `(defn ~name ~args > > (do (binding [*hierarchy* (conj *hierarchy* (str ~name)) > > *action-id* (action-id)] > > (log *action-id* *hierarchy*) > > �...@body)))) > > > Any top level calls of functions defined with defalgo will be logged > > with a different id because of the gensym. Functions called from > > within the toplevel call will be logged with the same id as the > > toplevel call. This all works perfectly fine. Why post this then? > > > I was testing this mechanism with a loop to simulate the recursive > > bindings and I got some unexpected behavior. > > > (defn action-id [] > > (if (nil? *action-id*) > > (gensym "action-") > > *action-id*)) > > > (defn action-id-test [] > > (loop [counter 0] > > (binding [*action-id* (action-id)] > > (println *action-id*) > > (if (< counter 3) > > (recur (inc counter)) > > nil)))) > > > Executing from the repl gave this result: > > > nl.tbb.cometucoco=> *action-id* > > nil > > nl.tbb.cometucoco=> (action-id-test) > > action-5177 > > action-5177 > > action-5177 > > action-5177 > > nil > > nl.tbb.cometucoco=> *action-id* > > action-5177 > > nl.tbb.cometucoco=> (set! *action-id* nil) > > nil > > nl.tbb.cometucoco=> (action-id-test) > > action-5184 > > action-5184 > > action-5184 > > action-5184 > > nil > > nl.tbb.cometucoco=> *action-id* > > action-5184 > > > *action-id* isn't rebound to its initial value. This only happens when > > the binding occurs inside the loop. This isn't the expected behavior > > right? Why is *action-id* sticky?? > > Known issue: > > http://code.google.com/p/clojure/issues/detail?id=27 > > Rich --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---
