Clojure函数调用的可选参数

时间:2017-11-05 11:00:53

标签: clojure arguments

我的值a可能是nil,也可能不是。{/ p>

我有一堆函数(在我的控制之外),如果它不是a,那么应该使用值nil作为第一个参数调用它。如果是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)))

是否有一个宏允许我这样做或者我应该自己做?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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))

对我而言,更优雅。