关于Clojure评估的澄清

时间:2016-12-31 07:58:01

标签: clojure evaluation

在Brave和True的Clojure中,第8章提出了一个名为if-valid的函数(然后被拒绝),以抽象出验证检查的重复部分:

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

作者解释说,上述状态下的功能不会以success-code工作,failure-code会在每次if-valid来电时对其进行评估。我的理解是,if函数的测试将返回true或false,并指示成功或失败代码是否运行。有人可以解释每个if电话会如何评估if-valid的其他部分和其他部分吗?

1 个答案:

答案 0 :(得分:3)

假设此函数使用如下:

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

这不好,因为必须先评估函数参数,然后才能将它们传递给函数。因此,在此函数有机会运行验证之前,每次都会执行首次打印“数据已接受”然后抛出异常的副作用。