1

我需要像 cond-> 这样的东西,它返回结果以及那些评估为 true 以给出该结果的分支。理想情况下,应该可以选择仅将解释部分用于测试和文档,并使其正常使用 cond->。我修改了 cond-> 像这样:

(defmacro explanatory-cond->
  "Adapted from Clojure's cond-> macro to keep a list of which conditions passed during evaluation"
  [expr & clauses]
  (assert (even? (count clauses)))
  (let [g (gensym)
        pstep
        (fn [[test step]]
          `(if ~test
            [(-> (if (vector? (first ~g)) (ffirst ~g) (first ~g)) ~step)
            (cons [(quote ~test) (quote ~step) (first ~g)] (second ~g))]
           ~g)
        )
       ]
    `(let [~g [~expr nil]
           ~@(interleave (repeat g) (map pstep (partition 2 clauses)))]
       ~g)))

这似乎可行,但从我对 monads 的浅薄知识看来,这里可能有使用它们的案例(装箱和拆箱该向量) - 任何大师评论都是这种情况吗?如果是这样,如何去做,如果不是这种修改 cond-> 要走的路吗?

4

0 回答 0