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值。