我的值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)))
是否有一个宏允许我这样做或者我应该自己做?
答案 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))
对我而言,更优雅。