This is some of my first Clojure code so it might not be the greatest ... yet!
Here is an improved memoize function that also takes a time-to-live argument. Useful when you want to expire results from the cache. I'm using it to cache query results from a database. This probably breaks some rules about functional programming though :-) (defn expire-cached-results [cached-results time-to-live] "Expire items from the cached function results." (into {} (filter (fn [[k v]] (> time-to-live (- (System/ currentTimeMillis) (:time v)))) cached-results))) (defn my-memoize "Returns a memoized version of a referentially transparent function. The memoized version of the function keeps a cache of the mapping from arguments to results and, when calls with the same arguments are repeated often, has higher performance at the expense of higher memory use. Cached results are removed from the cache when their time to live value expires." [function time-to-live] (let [cached-results (atom {})] (fn [& arguments] (swap! cached-results expire-cached-results time-to-live) (println cached-results) (if-let [entry (find @cached-results arguments)] (:result (val entry)) (let [result (apply function arguments)] (swap! cached-results assoc arguments { :result result :time (System/currentTimeMillis)}) result))))) Sample usage: (defn calculation [n] (println "Doing some bistromath") (* n 42)) (def foo (my-memoize calculation 5000)) ;; First execution user> (foo 10) Doing some bistromath 420 ;; Executed immediately after first time - cached result user> (foo 10) 420 ;; Executed after 5 seconds - not cached anymore user> (foo 10) Doing some bistromath 420 --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---