aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/memoize.clj
diff options
context:
space:
mode:
authorscgilardi <scgilardi@gmail.com>2008-11-12 22:31:20 +0000
committerscgilardi <scgilardi@gmail.com>2008-11-12 22:31:20 +0000
commit6f7a77e9cdc8df4f58fd86eed0dcd0dd6fc2d6fd (patch)
tree84939b269427bb8213c7db3e002628aa13816bd3 /src/clojure/contrib/memoize.clj
parentdb748f4c8b6f37da894b3c8f7a3bb683eea3f0aa (diff)
first cut at changes for Clojure SVN 1094+, my contribs and ones they depend on now load again
Diffstat (limited to 'src/clojure/contrib/memoize.clj')
-rw-r--r--src/clojure/contrib/memoize.clj31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/clojure/contrib/memoize.clj b/src/clojure/contrib/memoize.clj
new file mode 100644
index 00000000..558106c6
--- /dev/null
+++ b/src/clojure/contrib/memoize.clj
@@ -0,0 +1,31 @@
+;; Copyright (c) Stephen C. Gilardi. All rights reserved.
+;; The use and distribution terms for this software are covered by the
+;; Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
+;; which can be found in the file CPL.TXT at the root of this distribution.
+;; By using this software in any fashion, you are agreeing to be bound by
+;; the terms of this license.
+;; You must not remove this notice, or any other, from this software.
+;;
+;; File: memoize.clj
+;;
+;; scgilardi (gmail)
+;; 02 June 2008
+;;
+;; Based on Common Lisp code from:
+;; http://asymmetrical-view.com/talks/lisp-presentation/lisp-presentation.pdf
+
+(ns clojure.contrib.memoize)
+
+(defn 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."
+ [function]
+ (let [cache (ref {})]
+ (fn [& args]
+ (or (@cache args)
+ (let [result (apply function args)]
+ (dosync
+ (commute cache assoc args result))
+ result)))))