2012-11-05 70 views

回答

4

如果你想使用默認值,那麼通常的習慣用法是使用宏or

(or foo default-value) 

將返回default-valuefoo是falsey(零或假),或foo whenener foo是truthy(即除false以外的任何非零值)。

在這種情況下,您通常也可以使用if-not,因爲nil被認爲是錯誤的。當然,您需要注意實際的false值,因爲這些值將被視爲零。

作爲最後的選擇,你可以隨時使用宏來獲得完全if-nil?行爲您正在尋找:

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

請注意,如果false爲foo的有效值,則需要小心使用此解決方案。 –

2

爲什麼不能簡單地定義一個if-nil?宏:

(defmacro if-nil? [expr body] 
    `(let [e# ~expr] 
    (if (nil? e#) ~body e#))) 
+2

當心雙重評價:'(讓[E#〜EXPR](如(無? e#)〜body e#))' – kotarak

+0

當然,你絕對是對的。我被問題中給出的例子的簡單性所扼殺。謝謝! –

相關問題