If statement 判断(if)中零值的更简单方法?

If statement 判断(if)中零值的更简单方法?,if-statement,clojure,If Statement,Clojure,我经常这样写: (if (nil? a-value) another-value a-value) 是否有更简单的功能可用,如: (if-nil? a-value another-value) 为什么不简单地定义一个if nil?宏: (defmacro if-nil? [expr body] `(let [e# ~expr] (if (nil? e#) ~body e#))) (or foo default-value) 如果要使用默认值,通常的习惯用法是使用或宏: (

我经常这样写:

(if (nil? a-value) another-value a-value)
是否有更简单的功能可用,如:

(if-nil? a-value another-value)

为什么不简单地定义一个
if nil?
宏:

(defmacro if-nil? [expr body] 
  `(let [e# ~expr] 
    (if (nil? e#) ~body e#)))
(or foo default-value)

如果要使用默认值,通常的习惯用法是使用
宏:

(defmacro if-nil? [expr body] 
  `(let [e# ~expr] 
    (if (nil? e#) ~body e#)))
(or foo default-value)
foo
为false(nil或false)或
foo
为truthy(即除
false
之外的任何非nil值)时,将返回
默认值

您通常也可以在这种情况下使用,因为nil被认为是错误的。当然,您需要注意实际的
false
值,因为这些值将被视为nil

作为最后一个选项,您可以始终使用宏精确地获取所需的
if nil?
行为:

(defmacro if-nil? 
  ([a b] (if-nil? a b nil))
  ([a b c]
    `(if (nil? ~a) ~b ~c)))

请注意,如果false是foo的有效值,则需要小心使用此解决方案。注意双重计算:
(让[e#~expr](if(nil?e#)~body e#)
当然,您是绝对正确的。我被问题中给出的例子的简单性迷住了。谢谢