【发布时间】:2011-05-04 11:12:22
【问题描述】:
SQL 提供了一个名为 coalesce(a, b, c, ...) 的函数,如果它的所有参数都为 null,则返回 null,否则返回第一个非 null 参数。
您将如何在 Clojure 中编写这样的内容?
它将被这样调用:(coalesce f1 f2 f3 ...) 其中fi 是只有在需要时才应评估的表单。如果f1 不为零,则不应评估f2——它可能有副作用。
也许 Clojure 已经提供了这样的函数(或宏)。
编辑:这是我想出的解决方案(改编自 Stuart Halloway 的 Programming Clojure,第 206 页上的(and ...) 宏):
(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)))))
固定。
【问题讨论】: