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 -~----------~----~----~----~------~----~------~--~---