Macros 对于first not nil是否有标准clojure宏?

Macros 对于first not nil是否有标准clojure宏?,macros,clojure,Macros,Clojure,我正在寻找一个宏,它可以有效地执行与此相反的maybe-m。也就是说,我想要返回非nil的第一个表达式的结果,而不计算其余表达式。最后一部分很重要,因为如果“解决方案”使用惰性序列,那么它们将被分块计算……这意味着表达式可以在我不希望的时候进行计算 以下是我正在寻找的一个例子: (defn really-cool-stuff [a b c] (first-not-nil (operation1 a b) ; <-- this returns nil, (operatio

我正在寻找一个宏,它可以有效地执行与此相反的
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
(defn真正酷的东西[abc]
(首先不是零

(操作1 a b);因为
nil
是错误的,所以将执行您正在寻找的操作

(defn really-cool-stuff [a b c]
  (or
    (operation1 a b)
    (operation2 b c)
    (operation3 a b c)))
唯一的例外是,如果函数可能返回
false
。在这种情况下,您可以构建一个模仿
的宏,除非使用更严格的条件

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

因为
nil
是错误的,所以将执行您正在寻找的操作

(defn really-cool-stuff [a b c]
  (or
    (operation1 a b)
    (operation2 b c)
    (operation3 a b c)))
唯一的例外是,如果函数可能返回
false
。在这种情况下,您可以构建一个模仿
的宏,除非使用更严格的条件

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

好极了!幸运的是,在这种情况下,当不返回nil时,操作将始终返回truthy值。好极了!幸运的是,在这种情况下,当不返回nil时,操作将始终返回truthy值。