2016-12-31 50 views
1

在Clojure中的勇敢和真實,第8章,一個函數調用if-valid建議(當時拒絕)抽象掉驗證檢查的重複部分:澄清Clojure的評價

(defn if-valid 
    [record validations success-code failure-code] 
    (let [errors (validate record validations)] 
    (if (empty? errors) 
     success-code 
     failure-code))) 

筆者解釋說,功能在上述狀態下將不起作用,因爲success-codefailure-code將在每個if-valid呼叫上進行評估。我的理解是,if函數的測試將返回true或false,並指示成功或失敗代碼是否運行。請有人可以解釋爲什麼if的每個if-valid呼叫都會被評估嗎?

回答

3

假設這個函數的使用步驟如下:

(if-valid my-data validators 
    (println "Data accepted") 
    (throw (Exception. "Bad data :("))) 

這是不行的,因爲函數的參數必須進行評估,它們可以被傳遞給函數之前。因此,在這個函數有機會運行驗證之前,首次打印「接受數據」然後拋出異常的副作用都將被執行。