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

欢迎!请查看关于页面了解更多关于本站点如何运作的信息。

+11投票

重新标记

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

2 答案

+2投票

选择
0 投票

FWIW 我相信我们在工作中有一个 pred-> 的代码。也就是说对这个建议投一票。

...