Macros 解释性条件求值和单子?

Macros 解释性条件求值和单子?,macros,clojure,monads,Macros,Clojure,Monads,我需要像cond->这样的东西,它返回结果以及那些计算为true的分支,以给出结果。理想情况下,应该可以选择仅在测试和文档中使用解释部分,并使其处于正常使用状态。我修改了cond->如下所示: (defmacro explanatory-cond-> "Adapted from Clojure's cond-> macro to keep a list of which conditions passed during evaluation" [expr & clau

我需要像cond->这样的东西,它返回结果以及那些计算为true的分支,以给出结果。理想情况下,应该可以选择仅在测试和文档中使用解释部分,并使其处于正常使用状态。我修改了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)))

这似乎是可行的,但从我对单子的肤浅了解来看,这里可能有使用单子的理由(对向量进行装箱和拆箱)-是否有任何专家评论这是事实&如果是的话,怎么做,如果不是的话,对cond->的这种修改是否是一种方式?

您的案例中与之相似的特定单子似乎是
Writer
monad。但如果没有Haskell这样的强大静态类型系统,我认为这是没有意义的。“除了计算值之外,还产生数据流的计算”——听起来很棒@Ankur事实上,单子是有意义的,工作良好,在动态类型系统中也非常有用。