是否有一个标准的clojure宏为first-not-nil?

时间:2013-10-13 03:46:03

标签: macros clojure

我正在寻找能够有效地与此maybe-m相反的宏。也就是说,我希望第一个表达式的结果返回非nil 而不评估剩余的表达式。最后一部分很重要,因为如果“解决方案”使用延迟序列,那么它们将以块的形式进行评估...这意味着可以在我不希望它们时评估表达式。

以下是我正在寻找的一个例子:

(defn really-cool-stuff [a b c]
  (first-not-nil
    (operation1 a b) ; <-- this returns nil,
    (operation2 b c) ; <-- this returns non-nil, the result is returned
    (operation3 a b c))) ; <-- this is not evaluated

1 个答案:

答案 0 :(得分:7)

由于nil是假的,or会做你想要的。

(defn really-cool-stuff [a b c]
  (or
    (operation1 a b)
    (operation2 b c)
    (operation3 a b c)))

唯一的例外是函数是否可能返回false。在这种情况下,您可以构建一个模仿or的宏,但条件更严格。

(defmacro or-nil?
  ([] nil)
  ([x] x)
  ([x & next] `(let [or# ~x] (if (nil? or#) (or-nil? ~@next) or#))))