thanks Ken, your second vecify was exactly what I was looking for! .. I feel it would be good candidate for the core. Sunil.
On Thu, Dec 16, 2010 at 12:19 PM, Ken Wesson <kwess...@gmail.com> wrote: > On Thu, Dec 16, 2010 at 1:33 AM, Sunil S Nandihalli > <sunil.nandiha...@gmail.com> wrote: > > Hello everybody, > > I would like to write regular code something like > > [1 2 ~@(map some-fn some-coll) 4 5] > > is this possible? > > (vec (concat [1 2] (map some-fn some-coll) [4 5])) > > will do it. > > A tidier form would be: > > user=> (vecify 1 2 (map #(* % %) (range 3)) 4 5) > [1 2 0 1 4 4 5] > > which this enables: > > (defn vecify [& stuff] > (loop [v [] s (seq stuff)] > (if s > (let [f (first s)] > (if (coll? f) > (recur (into v f) (next s)) > (recur (conj v f) (next s)))) > v))) > > with the caveat that it assumes you want to splice any coll in the > arglist. If you want to include a coll in the arglist as a single > element of the output vector you can wrap it in []. A more DSLey > variant: > > (defn vecify [& stuff] > (loop [v [] s (seq stuff) splice false] > (if s > (let [f (first s)] > (if (coll? f) > (if splice > (recur (into v f) (next s) false) > (recur (conj v f) (next s) false)) > (if (= f :splice) > (recur v (next s) true) > (recur (conj v f) (next s) false)))) > v))) > > user=> (vecify 1 2 :splice (map #(* % %) (range 3)) :k [0 8] 4 5) > [1 2 0 1 4 :k [0 8] 4 5] > > This one requires you to use :splice [:splice] instead of just :splice > in the arglist to get the literal keyword :splice in the vector. > Otherwise :splice splices the following coll in (and is ignored > entirely if what follows isn't a coll); otherwise the coll is inserted > as a single element. This comes closest to unquote-splicing's > behavior. > > -- > 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<clojure%2bunsubscr...@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 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