2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面以获取更多关于该方式的信息。

+11

被标记

我们有 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)))))

2 个答案

+2

被选中
0

FWIW 我相信我们在工作中的代码中存在 pred->。也就是说,对这项建议投赞成票。

...