Missing some parens there. Should be (->> (take 2)), of course. On Feb 4, 12:53 pm, Alan <a...@malloys.org> wrote: > Another solution, which is not especially satisfying but is worth > considering, is to use the most-common thread style at the top level, > and interweave some exceptions for the less-common style. > > (-> 10 > range 20 > (->> take 2)) > or > (->> 10 > (#(range % 20)) > (take 2)) > > On Feb 4, 12:05 pm, B Smith-Mannschott <bsmith.o...@gmail.com> wrote: > > > Clojure's threading macros -> and ->> to be quite a win. It breaks > > down when the expression to be chained together are not consistent in > > nesting the threaded expression second or last. An idiomatic way to > > gain the necessary flexibility seems to be via let: > > > (let [x (line-seq x) > > x (sort x) > > ...] > > x) > > > I've never been very happy with that solution. The same variable > > appears multiple times in the same let. Maybe that just confuses my > > Scheme sensibilities. (I know there are previously been discussions > > about a variant of -> which allows the threading position to be marked > > in some way, though these never really went anywhere. I also rejected > > the alternative of using an anaphoric macro which always uses 'it or > > '$ or some such as the name to thread through. That didn't seem very > > Clojuresque.) > > > I came up with this macro, but I'm unsure what to call it: > > > (defmacro thread-let [[varname init-expression :as binding] & expressions] > > {:pre [(symbol? varname) > > (not (namespace varname)) > > (vector? binding) > > (= 2 (count binding))]} > > `(let [~@(interleave (repeat varname) (cons init-expression expressions))] > > ~varname)) > > > usage example: > > > (thread-let [x (initial-value)] > > (foo x 3) > > (bar 1 2 x)) > > > which is equivalent to: > > > (let [x (initial-value) > > x (foo x 3) > > x (bar 1 2 x)] > > x) > > > What should I name this thing? I'm concerned that "thread" is > > confusing due to its dual meaning. let seems in line with clojure > > conventions. > > > (thread-let [x ...] ...) > > (thread-with [x ...] ...) > > (thread-through [x ...] ...) > > (let-> [x ...] ...) > > > thoughts? > > > // Ben > >
-- 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