2017-11-05 1 views
0

Ich habe einen Wert a, der nil sein kann oder nicht.Clojure optionales Argument zum Funktionsaufruf

Ich habe eine Reihe von Funktionen (außerhalb meiner Kontrolle), die mit dem Wert als erster Parameter aufgerufen werden sollte, wenn es nicht nil ist. Wenn es nil ist, sollte die Funktion ohne a aufgerufen werden.

Statt:

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

Ich möchte wie etwas tun:

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

Gibt es ein Makro, das mir dies bereits tun können, oder sollte ich meine eigenen zu machen?

+0

Ist 'a' eine Namespace-Level-Variable? Es ist nicht als ein Argument für Ihre Funktion definiert? –

+0

Es ist eine dynamische Top-Level-Variable, die möglicherweise nicht Null ist. – siltalau

Antwort

3

können Sie wickeln die Berufung dieser über-your-Control-Funktionen mit einer anderen Funktion

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

Proben:

(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 Antwort richtig ist. Ich ging mit einem Makro wegen einer persönlichen Abneigung gegenüber einfachen Funktionen als Parameter.

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

Dies ermöglicht es mir, es zu benutzen, wie so:

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

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

, die ich ist, eleganter.

Verwandte Themen