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?? Vincent --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---