1

所以我正在研究一个流函数,它将总结几个事件的一些指标。为此,我使用该project函数,它看起来像这样:

(project [(func (:service event) (nth service-list 0))      
          (func (:service event) (nth service-list 1))
          (func (:service event) (nth service-list 2))]
         (..))

service-list是周围函数的一个参数,它包含一个必须相加的服务向量。func是一个函数,它接受两个参数并返回一个true/false使用上面的代码片段可以正常工作,但我希望能够简化它,以便大于或小于 3 个元素的向量可以工作。

到目前为止,我有这个:

    (project (mapv (fn[service] (
                   `func (:service event) ~service)
                   ) service-list)))
             (..)

我认为它返回一个未评估的函数向量。一旦我意识到这project是一个宏,我就采用了这种方法。不知道我是否做对了...

4

1 回答 1

1

您面临的问题是您不能仅动态组装宏调用的参数。因此,您需要动态组装整个宏调用。

您可以构建一个 clojure 表单并在其上调用eval。采取以下措施。

    (let [args (mapv #(list 'func (:service 'event) %) service-list)
          form (list 'project args (...))]
      (eval form))

或者,您也可以使用riemann.streams/project*函数来使用谓词函数而不是where表达式。

于 2017-09-28T08:12:20.547 回答