2013-12-09 55 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)