Remember that only the last form will be returned. So: (defn foo [] 1 2 3 4)
will always return 4. The same principle applied with your macro. You define four forms, but only return the last one. Instead, try wrapping all the forms in a "do" block. As an aside, this doesn't look like a good use-case for macros. You'd probably be better defining a map with keys for :worker, :channel, etc. Either that or a protocol. - James On 10 December 2013 17:42, larry google groups <lawrencecloj...@gmail.com>wrote: > I am working on web software where admins will be using HTML forms to > update data in a MongoDb database. I decided to use Lamina to off-load > the work to the background. There are several operations that need to > happen: updates, deletions, etc, and I thought I'd put each on a different > channel. So I tried to write a macro to generate the code needed for each > of those channels. This was my first attempt: > > (defmacro establish-channel [action noun to-execute start-function-name] > (let [channel-name (symbol (str "documents-to-" action "-in-" noun > "-channel")) > additive-action-name (symbol (str "add-to-" action "-channel")) > worker-name (symbol (str action "-" noun "-worker"))] > > `(def ~channel-name (channel)) > > `(defn ~additive-action-name [document] > (enqueue ~channel-name document)) > > `(defn ~worker-name [] > (loop [document @(read-channel ~channel-name)] > (~to-execute document) > (recur @(read-channel ~channel-name)))) > > `(defn ~start-function-name [] > (future (~worker-name)) > (future (~worker-name)) > (future (~worker-name)) > (future (~worker-name)) > (future (~worker-name))))) > > > But in the repl, when I run this, and then I do this: > > user> (macroexpand-1 (establish-channel update mongo println > start-mongo-channel)) > > I get: > > CompilerException java.lang.RuntimeException: Unable to resolve symbol: > update-mongo-worker in this context, compiling:(NO_SOURCE_PATH:1:16) > > It seems to be complaining about this line: > > (future (~worker-name)) > > But I defined that function just above that line: > > `(defn ~worker-name [] > > So what could the problem be? > > -- > -- > 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/groups/opt_out. > -- -- 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/groups/opt_out.