2015-03-30 107 views
0

使用datomic和clojure我查詢數據庫並獲得九個元素的列表。填充一次列表

我想在頁面上繪製這九個元素,在這一點上他們保證是不同的元素。

但是,每次我調用該函數時,它都會重新查詢,返回一個新列表,然後從新列表中獲取一個元素。這是非常低效的,並且還引入了重複的可能性。

我想記住這個列表,並使它成爲第n個索引。建議和想法歡迎。

回答

2

而不是調用「函數」,你應該只調用它,如果你還沒有調用它已經。如果你打電話,確保存儲結果。如果你不叫它,查找結果。

memoizehttp://crossclj.info/fun/clojure.core/memoize.html)可能會幫助您實現這一目標。根據你的緩存需求,你可能想研究它的實現並實現更合適的東西。

您可能想要參考https://github.com/clojure/core.memoize來獲得服務器端更復雜的memoization需求。

任何列表都可以用O(n)索引。對於O(log 32 n)性能,請使用vec從它創建一個向量。

+0

謝謝!我最終通過#Clojure freenode頻道瞭解了http://clojuredocs.org/clojure.core/delay延遲。當一個對fxn進行破壞時,它會運行一次並緩存結果;未來的derefs將得到緩存的結果。使用延遲(讓[結果(延遲(查詢...))] ___ @result)幫助我實現我想要的。再次感謝您的幫助 – sova 2015-03-31 21:54:26

+1

如果函數不帶任何參數,則延遲很有用。我不相信你的例子說你已經實現了記憶,因爲每次你的表單被評估時都會產生一個新的延遲。請注意,我已經添加了一個鏈接到core.memoize到答案。 – 2015-04-01 18:21:32