我需要像 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-> 要走的路吗?