That works perfectly. I forgot about macroexpand-1...but I also didn't
think that the (1 2 3) list would be evaluated using 1 as a function
too.

Thanks both of you for the great help.

On May 12, 8:33 am, "J. McConnell" <jdo...@gmail.com> wrote:
> On Tue, May 12, 2009 at 11:22 AM, samppi <rbysam...@gmail.com> wrote:
>
> > Oh, no...I understand now—it looks like I've incorrectly explained my
> > problem.
>
> > I want to use the macro like this: (a 1 2 3) equivalent to (m-seq [1 2
> > 3]).
>
> > Clojure 1.0.0-
> > user=> (use 'clojure.contrib.monads)
> > nil
> > user=> (defn a [& xs]
> > (with-monad maybe-m (m-seq xs)))
> > #'user/a
> > user=> (a 1 2 3)
> > (1 2 3)
> > user=> (defmacro b [& xs]
> > `(with-monad maybe-m (m-seq ~xs)))
> > #'user/b
>
> I haven't played with monads at all, but if I'm understanding
> everything correctly, I believe macroexpand is your friend again,
> here:
>
> 1:8 user=> (macroexpand-1 '(b 1 2 3))
> (clojure.contrib.monads/with-monad clojure.contrib.monads/maybe-m
> (clojure.contrib.monads/m-seq (1 2 3)))
>
> So, the arguments are put into a list with this version and "1" is
> being called as a function. However, with this you get your vector:
>
> 1:9 user=> (defmacro c [& xs] `(with-monad maybe-m (m-seq ~(apply vector 
> xs))))
> #'user/c
> 1:10 user=> (c 1 2 3)
> (1 2 3)
> 1:11 user=> (macroexpand-1 '(c 1 2 3))
> (clojure.contrib.monads/with-monad clojure.contrib.monads/maybe-m
> (clojure.contrib.monads/m-seq [1 2 3]))
>
> HTH,
>
> - J.
--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to