我们有 some->
和 some->>
,这对于以 nil 作为终止值的管道来说非常好,但在许多情况下您可能希望管道在提供更多信息时停止。
例如,在工作中,我们有一个图像处理管道,每个步骤要么生成增强的图像信息,要么生成一个错误哈希表,该哈希表解释为什么管道无法进行。我们目前必须将错误检查显式地编码到管道的每个步骤中。
添加接受 [pred expr & forms]
的 pred->
和 pred->>
宏,其结构与 some->
和 some->>
类似,会使这变得更加简洁。
因此,some->
和 some->>
可以基本上是 pred-> some?
和 pred->> some?
(defmacro pred->
"When expr satisfies pred, threads it into the first form (via ->),
and when that result satisfies pred, through the next etc"
[pred expr & forms]
(let [g (gensym)
p pred
steps (map (fn [step] `(if (~p ~g) (-> ~g ~step) ~g))
forms)]
`(let [~g ~expr
~@(interleave (repeat g) (butlast steps))]
~(if (empty? steps)
g
(last steps)))))