2017-11-05 10 views
0

값이 a이고 값이 nil 일 수도 있고 아닐 수도 있습니다.함수 호출에 대한 Clojure 선택적 인수

nil이 아닌 경우 첫 번째 매개 변수로 a 값을 사용하여 호출해야하는 많은 함수가 있습니다 (내 제어 외부). nil 인 경우 a없이 함수를 호출해야합니다.

(defn my-fn [x] 
    (if a 
     (beyond-my-control-fn a x) 
     (beyond-my-control-fn x))) 

나는 같은 것을 할 싶습니다 :

(defn my-fn [x] 
    (add-argument-if-not-nil-> a (beyond-my-control-fn x))) 

날이 이미이 작업을 수행하기 위해 또는 내가 내 자신을해야 할 수있는 매크로가 있습니까 대신

?

+0

'a'는 네임 스페이스 수준 변수입니까? 함수에 대한 인수로 정의되지 않았습니까? –

+0

이것은 동적 최상위 변수이며 nil 일 수도 있고 없을 수도 있습니다. – siltalau

답변

3

당신은 다른 기능과

(defn call-with-a-if-not-nil 
    [f a & args] 
    (if (nil? a) 
    (apply f args) 
    (apply f a args))) 

샘플을 넘어서는 - 네 - 제어 기능의 호출을 래핑 할 수 있습니다

(call-with-a-if-not-nil beyond-my-control-fn a x) 

(call-with-a-if-not-nil beyond-my-control-fn-1 a v w) 
0

mavbozo의 답변이 정확합니다. 매개 변수로 간단한 기능을 개인적으로 싫어하기 때문에 매크로를 사용했습니다.

(defmacro nn-> [x form] 
    (if x 
    `(-> ~x ~form) 
    `~form)) 

이 날과 같이 사용할 수 있습니다 : 나에게있다

(nn-> a (beyond-my-control-fn x)) 

(nn-> a (beyond-my-control-fn x y z)) 

, 더 우아한.