黎曼工程函数的变量参数

Variable Arguments for Riemann project function

所以我正在研究一个流函数,它将总结几个事件的一些指标。为此,我使用 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 是一个带有两个参数的函数, returns a true/false 使用上面的代码片段工作正常,但我希望能够简化它以便大于或小于 3 个元素的向量都可以。

到目前为止我有这个:

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

我认为 returns 一个未计算的函数向量。一旦我意识到 project 是一个宏,我就采用了这种方法。不知道我做的是否正确...

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

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

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

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