我们目前有 some->
和 some->>
,它们非常适合管道操作,其中 nil
是终止值,但许多情况下您可能想要使用更多信息的管道终止。
例如,在工作的图像处理管道中,每个步骤会生成增强的图像信息或错误哈希对象,解释为什么管道无法继续。我们目前必须显式地将错误检查编码到管道的每个步骤中。
添加接受 [pred expr & forms]
且结构上类似 some->
和 some->>
的 pred->
和 pred->>
宏会使这一切变得更为简洁。
那么,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)))))