13

やや高価な計算 (データベースの開始) があり、実際に使用する場合にのみデータベースを作成したいと考えています。使用された (または逆参照された) 場合にのみその値を評価する参照変数 (または可能であれば単純な変数) を探しています。概念的には次のようなもの。

(def v (lazy-var (fn [] (do (println "REALLY EXPENSIVE FUNCTION") true))))

将来、var v を使用するか、@v を呼び出すと、"REALLY EXPENSIVE FUNCTION" が出力され、v の値が true になります。ここで重要なことは、変数が (逆) 参照されるまで fn が評価されないことです。必要に応じて、変数の値を計算するために関数が 1 回だけ評価されます。これはclojureで可能ですか?

4

2 に答える 2

31

delayこのアプリケーションに最適です:

delay- (delay & body)

式の本体を取り、(forceまたはderef/@を使用して) 最初に強制されたときにのみ本体を呼び出し、結果をキャッシュして、後続のすべての呼び出しでそれを返すDelay オブジェクトを生成しforceます。

呼び出しの本体内にデータベース ハンドルを構築するコードを配置しdelay、Var として格納します。次に、DB ハンドルを使用する必要があるときはいつでも、この Var を逆参照します。最初の逆参照で本体が実行され、その後の逆参照でキャッシュされたハンドルが返されます。

(def db (delay (println "DB stuff") x))

(select @db ...) ; "DB stuff" printed, x returned
(insert @db ...) ; x returned (cached)
于 2012-06-14T03:52:02.283 に答える