2

実際の関数本体で使用できるように、前提条件で実行された計算の結果を格納する方法はありますか。

これはひどいです (コストのかかる計算が 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} 条件はありません。

または、マクロを作成して、必要なことを正確に実行してください。

defn マクロが作成された方法ではないため、スマートバーは機能しません。
REPL内でこれを試してください:

(source defn)
于 2013-12-09T10:45:44.727 に答える