Thanks for a great idea Andrew! I was slightly annoyed by the lack of consistency in parameter ordering of Clojure collections API (cons vs conj, get/assoc vs filter/ map/take). IMHO the input collection should ALWAYS be the last param. Then simple ->> macro would be sufficient in most cases. Out of curiosity (and because apparently your code is not open- source :-) I've re-written it as:
(defmacro -$> [ & forms ] (reduce #(replace {'$ %1} %2) forms)) It does not support your non-seq entries in the pipeline, but I personally don't want them. I'm guessing they are to be able to write something like (-$> 1 (* 3 $) inc) instead of (-$> 1 (* 3 $) (inc $)) or do you have a better use for it? Thanks again, - Dmitry On Oct 29, 12:35 pm, "AndrewC." <mr.bl...@gmail.com> wrote: > Here's a macro that generalizes the two 'threading' macros -> and ->>. > > It works by using the idea of 'nesting marker' (from Oz) to specify > where the result of the previous form should be nested in the > subsequent form. > > (defmacro -$> > "Threads the expr through the forms. Inserts x into > the first form at the position marked by the $ symbol. > If the second form is not a list then it behaves as ->. > If there are more forms, inserts the first form into the second > form at the position marked by the $ symbol, etc." > ([x form] (if (seq? form) > (let [split (split-with (partial (complement =) '$) > form)] > `(~@(first split) ~x ~@(rest (second split)))) > (list form x))) > ([x form & more] `(-$> (-$> ~x ~form) ~...@more))) > > If this is any use to anyone (esp. anyone who has a CA) then consider > it public domain. > > Any improvements appreciated! -- 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