2017-09-28 16 views
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は、2つの引数をとり、true/falseを返す関数です。上記のスニペットを使用するとうまくいきますが、3要素より大きいまたは小さいベクトルが機能するように簡略化したいと考えています。

は、これまでのところ私はこれを持っている:私は返します未評価されている関数のベクトルを考える

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

。私はprojectがマクロであることを理解すると、このアプローチを行った。私が正しいことをしているかどうかは分かりません...

答えて

1

問題は、マクロ呼び出しの引数だけを動的に組み立てることができないということです。したがって、マクロ呼び出し全体を動的にアセンブルする必要があります。

クロージャーフォームを作成し、evalを呼び出すことができます。次のようにします。

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

かは、あなたもどこ表現するのではなく、述語関数を使用するようにriemann.streams/project*機能を使用することができます。

関連する問題