用于定义输出的Clojure中类似于fnil的函数

时间:2018-01-16 21:40:40

标签: clojure null

在Clojure中,fnil函数可用于包装另一个函数:如果包装函数的参数为​​nil,则包装器会将其更改为其他函数。

E.g。 ((fnil * 0) nil) ; returns 0(* nil 0)会抛出NPE。

我要问的是,如果输入为nil,是否存在修改输出的类似内置函数。 (换句话说,它甚至不会调用包装函数,而只是返回默认值。)

换句话说,是否存在与以下内容等效的内置函数?

(defn ifnil [fun default]
      (fn [& args]
          (if (some nil? args) default (apply fun args))))


; ((ifnil * nil) 1 2 3) ; returns 6
; ((ifnil * nil) 1 nil 3) ; returns nil

N.B。:一如既往,"不,没有这样的功能"也是一个有效的答案(我怀疑,顺便说一句。)

1 个答案:

答案 0 :(得分:1)

据我所知,没有这样的功能。您的实现看起来很好,所以为什么不在代码中使用它。

这里可以改进的是一个更好的功能名称:ifnil对于你的队友或那些支持你的代码的人来说可能有点混乱。

另外,你说in case the input is nil。但是在您的代码中,您检查至少一个参数是nil。这略有不同。

还有一件事,就我个人而言,我不是默默无声地默认的粉丝。也许,您最好手动或使用架构/规范和写日志来验证输入数据。因为fnil主要用于update / update-in的非现有密钥。但是你的功能往往是一个验证者。