Why don't you put the "let" that defines the atom counter inside the quoted form?
- James On 7 April 2017 at 22:21, Max Muranov <[email protected]> wrote: > I need to create logger for machine learning debugging. First, I wanted to > perform this string: > > (create-logger 10 "Epoch #" :epoch ", Error: " :error) > > This code will cause this output while training: > > Epoch #10, Error: 2.0 > Epoch #20, Error: 1.0 > Epoch #30, Error: 0.0 > Epoch #40, Error: 0.0 > ... > > I wrote this code: > > ;; Training logging > > (defmulti resolve-logger-keyword (fn [kwd] kwd)) > > (defmethod resolve-logger-keyword :epoch [_] > (fn [trainer] (.getIteration trainer))) > > (defmethod resolve-logger-keyword :error [_] > (fn [trainer] (.getError trainer))) > > (defmacro create-log-func [args] > `(fn [trainer#] > (for [arg# ~args] > (if (keyword? arg#) > ((resolve-logger-keyword arg#) trainer#) > arg#)))) > > (defn create-logger [each-n-messages & args] > (let [counter (atom 0) > logger-message (create-log-func args)] > (fn [trainer] > (swap! counter inc) > (when (<= each-n-messages @counter) > (swap! counter (fn [_] 0)) > (println (apply str (logger-message trainer))))))) > > > This code works fine. But now I want this line be possible: > > (create-logger 10 "Epoch #" :epoch ", Error: " (* :error -1)) > > > In other words, I want to perform operations over this logger parameters. > It's inside of the logger, so at first I need to make macro create-logger > instead of function. > I try to write this: > > (defmacro create-logger [each-n-messages & args] > (let [counter# (atom 0) > logger-message (create-log-func args)] > `(fn [trainer#] > (swap! ~counter# inc) > ; These lines are not important yet > ; (when (<= ~each-n-messages @~counter) > ; (swap! ~counter (fn [_] 0)) > ; (println (apply str (~logger-message trainer#))))))) > > And after trying to execute the first line: > > (create-logger 10 "Epoch #" :epoch ", Error: " :error) > > I get the error: > > clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Can't > embed object in code, maybe print-dup not defined: > clojure.lang.Atom@501e8e4f, compiling:(D:\Programming\ > Clojure\Projects\trade-ai-server\src\trade_ai_server\ai_trader.clj:97:1) > > > > > > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to [email protected] > Note that posts from new members are moderated - please be patient with > your first post. > 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 > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] Note that posts from new members are moderated - please be patient with your first post. 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
