2017-09-28 4 views
1

그래서 여러 이벤트에 대한 메트릭을 요약하는 스트림 함수를 작업 중입니다. 이를 위해 나는 project 기능을 사용하고이 같은 :Riemann 프로젝트 함수에 대한 변수 인수

(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 개의 요소보다 크거나 작은 벡터가 작동하도록 간단하게 만들 수 있습니다.

지금까지 나는이있다 : I는 반환에게 평가되지 않은되는 함수의 벡터를 생각

(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* 기능을 사용할 수 있습니다.