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 <[email protected]> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en