Thank you for your answer David. I think I am confused about how to distinguish between a symbol and a variable, as I thought that the symbol being derefed pointed to the atom that it was made to define when transparent-chan was called.
Also, I am trying to specifically solve the logging problem to understand how I might use stored values or state outside the scope of the channel as a means of creating the illusion of referencing its contents. Later I was thinking about incorporating it into a gui to see if it's possible to design an asynchronous message passing system using drag and drop icons that represent pubs and subs, channels with a drop-down contents tab, and running listening processes. I know this is probably out of my league, but I was just asking myself how something like that might be implemented. I will of course continue to learn and reinforce the basics though on my own. Jesse On Monday, May 12, 2014 1:26:57 PM UTC+9, David Della Costa wrote: > > 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 clo...@googlegroups.com<javascript:> > >> Note that posts from new members are moderated - please be patient with > >> your first post. > >> To unsubscribe from this group, send email to > >> clojure+u...@googlegroups.com <javascript:> > >> 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+u...@googlegroups.com <javascript:> > >> <mailto:clojure+u...@googlegroups.com <javascript:>>. > >> 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.