Clarification on Clojure evaluation
在 Clojure for the Brave and True 第 8 章中,提出了一个名为
1 2 3 4 5 6 | (defn if-valid [record validations success-code failure-code] (let [errors (validate record validations)] (if (empty? errors) success-code failure-code))) |
作者解释说,在其上述状态下的函数将无法工作,因为
假设这个函数的使用如下:
1 2 3 | (if-valid my-data validators (println"Data accepted") (throw (Exception."Bad data :("))) |
这不好,因为函数参数在传递给函数之前必须先求值。因此,在此函数有机会运行验证之前,每次都会执行首先打印"数据已接受"然后抛出异常的副作用。