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 <[email protected]>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 [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/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 [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/groups/opt_out.