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一緒に追加する必要があるサービスのベクトルを含む周囲の関数の引数です。は、2 つの引数を取り、 /をfunc返す関数です。上記のスニペットを使用すると問題なく動作しますが、3 要素よりも大きいまたは小さいベクトルが機能するように単純化できるようにしたいと考えています。truefalse

これまでのところ、私はこれを持っています:

    (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 に答える