1

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

这是我正在寻找的示例:

(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
4

1 回答 1

8

因为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#))))
于 2013-10-13T03:57:59.260 回答