2

有什么方法可以存储在前提条件下执行的计算结果,以便可以在实际的函数体中使用它。

这太糟糕了(昂贵的计算运行两次):

(defn bar [x]                                                                           
  {:pre [(> (costly-computation x) 1337)]}                                                
  (costly-computation x))

我想按照这些思路做一些事情。但这不起作用。

(defn smartbar [x]
  (let [res (costly-computation x)]                                                       
    {:pre [(> res 1337)]}
    res))
4

1 回答 1

3

你有多种方法来解决这个问题。例如,您可以在 (bar) 函数之外计算(costly-computation x)并将其作为参数传递给 (bar) 函数。

或者您可以在 (bar) 函数内计算(costly-computation x)并在那里验证,没有 {:pre} 条件。

或者写一个宏来做你想做的事!

您的 smartbar 将无法工作,因为这不是创建 defn 宏的方式。
在 REPL 中试试这个:

(source defn)
于 2013-12-09T10:45:44.727 回答