2013-12-09 91 views
2

是否有任何方法来存储在前提条件下执行的计算结果,以便它可以在实际的函数体中使用。局部变量的Clojure前提条件

这是可怕的(昂贵,计算运行两次):

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

我想要做的东西沿着这些路线。但这不起作用。

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

它看起来更像是一个:后置条件? –

+0

一个职位条件应该工作。此外,如果您的条件不符合,您可以简单地使用'assert'强制执行错误。 – noisesmith

+0

这是一个人为的例子。我需要在执行大量的函数体之前检查条件。邮政条件不是我想要的。 – 4ZM

回答

3

您有多种方法可以解决这个问题。例如,您可以计算(bar)函数外部的(昂贵计算x)并将其作为参数传递给(bar)函数。

或者你可以计算(昂贵计算x)里面(bar)函数并在那里验证,没有{:pre}条件。

或写一个宏来做你想要的!

您的智能酒吧是不会工作的,因为这不是如何创建defn宏来做。
试试这个REPL里面:

(source defn)