2017-09-28 2 views
1

Also arbeite ich an einer Stream-Funktion, die einige Metriken für mehrere Ereignisse zusammenfasst. Dazu verwende ich die project Funktion und es sieht etwa so aus:Variable Argumente für Riemann-Projektfunktion

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

service-list ist ein Argument der umgebenden Funktion, die einen Vektor von Dienstleistungen enthält, die addiert werden müssen. func ist eine Funktion, die zwei Argumente akzeptiert und eine true/false Die Verwendung des obigen Snippet funktioniert gut, aber ich möchte in der Lage sein, es zu vereinfachen, so dass ein Vektor, der größer oder kleiner als 3 Elemente ist, funktionieren würde.

Bisher habe ich dies:

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

, die ich zurückkehrt einen Vektor von Funktionen denken, die nicht ausgewerteten sind. Ich ging mit diesem Ansatz, sobald ich erkannte, dass project ein Makro ist. Keine Ahnung, ob ich das Richtige mache ...

Antwort

1

Das Problem, mit dem Sie konfrontiert sind, ist, dass Sie nicht nur die Argumente eines Makroaufrufs dynamisch zusammensetzen können. Daher müssen Sie den gesamten Makroaufruf dynamisch zusammenstellen.

Sie können ein Clojure-Formular erstellen und eval darauf anrufen. Nimm folgendes.

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

Oder könnten Sie auch die riemann.streams/project* Funktion Prädikatfunktionen verwenden statt wo Ausdrücke.

Verwandte Themen