I apologize, apparently you can't use go-loop how I did below, => (def my-go-loop (async/go-loop [msg (async/<! c)] (println "got msg " msg " from channel " 'c)))
...try this instead: (def my-go-loop (async/go-loop [] (let [msg (async/<! c)] (println "got msg " msg " from channel " 'c)))) Sorry about that! DD (2014/05/12 13:21), Dave Della Costa wrote: > >> 1) I feel like it is a redundant to define bindings multiple times in >> my go's let exprs when the params have already been passed in as >> arguments. Is there a more idiomatic way to do this? > > I think the fact that you are re-binding in a let should show you that > these variables are already in scope: that let is wholly redundant, just > remove it. > > >> 2) Whenever I try to create a generic process to automatically >> generate a log-name for each channel and then call update, I get a >> 'symbol cannot be cast to atom' error. How can I get around this? It >> seems to happen even if I don't use the log-name function. > > It's simple: a symbol is not an atom. It's telling you exactly what you > need to know: you cannot call swap! on a symbol. Make sure your atom is > the first argument to swap! wherever you use it. > > >> 3) Is there a better way to keep track of what's on a channel that >> doesn't use macros? > > You cannot look inside of a channel, but to do what you want and get a > sense of how core.async works, I think you are on the right track by > logging as you put stuff in and take it out. > > That said, I would start by getting rid of the log and the macro--these > are unnecessary complications--and do things very simply: > > => (require '[clojure.core.async :as async]) > nil > => (def c (async/chan)) > #'user/c > => (def my-go-loop (async/go-loop [msg (async/<! c)] (println "got msg " > msg " from channel " 'c))) > #'user/my-go-loop > => (defn put-and-print! [c msg] (println "putting msg " msg " onto > channel " 'c) (async/put! c msg)) > #'user/put-and-print! > => (put-and-print! c "I am a message!") > putting msg I am a message! onto channel c > got msg I am a message! from channel c > nil > => > > Printing out "channel c" is kind of silly since there is only one, but > it sounds like you may want to do this with multiple channels so this is > one way to print out the variable name--simply quote it. > > DD > > (2014/05/12 11:41), gamma235 wrote: >> Hi everyone, >> >> I am getting my feet wet with core.async and am trying to attach atoms >> to channels that update automatically and print out to the console as >> you take and put. This is not for anything serious, just a way to get >> familiar with the behavior and functionality of the library and practice >> my Clojure skills. Thanks in advaan >> >> Here is my code: >> >> (defn log-name [ch] (symbol (str ch '-log))) >> >> ;; Is this efficiently written? >> (defmacro transparent-chan [ch] >> (do >> `(def ~ch (chan)) >> `(def (log-name ~ch) (atom [])) >> `(println "new transparent channel created!"))) >> >> (defn- update [log v] >> (do >> (swap! log conj v) >> (println "log test passed: " v " has been logged") >> (println "channel contents: " @log))) >> >> (defn transparent-put [ch v] >> (let [log (log-name ch)] >> (go >> (let [ch ch >> v v] >> (>! ch v) >> (println v " has been successfully moved through the channel"))) >> (update log v) >> (println "put test passed: " v " has been put on the channel") >> (println " rechecking channel contents: " @log))) >> >> (defn transparent-take [ch] >> (go >> (let [v (<! ch) >> log-name (symbol (str ch '-log))] >> (swap! log-name #(remove #{v} %)) >> (println v "has been removed from channel"))) >> (println " removal pending")) >> >> >> >> ;; tests >> (transparent-chan c) >> c >> c-log >> @c-log >> (transparent-put c 42) >> (transparent-take c) >> >> >> >> My main questions are regarding variable scope: >> 1) I feel like it is a redundant to define bindings multiple times in my >> go's let exprs when the params have already been passed in as arguments. >> Is there a more idiomatic way to do this? >> >> 2) Whenever I try to create a generic process to automatically generate >> a log-name for each channel and then call update, I get a 'symbol cannot >> be cast to atom' error. How can I get around this? It seems to happen >> even if I don't use the log-name function. >> >> 3) Is there a better way to keep track of what's on a channel that >> doesn't use macros? >> >> -- >> 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 unsubscribe from this group and stop receiving emails from it, send >> an email to clojure+unsubscr...@googlegroups.com >> <mailto:clojure+unsubscr...@googlegroups.com>. >> 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 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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.