SQL 提供了一个调用函数coalesce(a, b, c, ...)
,如果它的所有参数都为 null,则返回 null,否则返回第一个非 null 参数。
你会如何在 Clojure 中编写这样的东西?
它将被称为:(coalesce f1 f2 f3 ...)
where是仅在需要时才应评估fi
的表单。如果是非零,那么不应该被评估——它可能有副作用。f1
f2
也许 Clojure 已经提供了这样的函数(或宏)。
编辑:这是我想出的一个解决方案(从 Stuart Halloway 的 Programming Clojure 修改,(and ...)
第 206 页的宏):
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if c# c# (coalesce ~@rest)))))
似乎工作。
(defmacro coalesce
([] nil)
([x] x)
([x & rest] `(let [c# ~x] (if (not (nil? c#)) c# (coalesce ~@rest)))))
固定的。