aboutsummaryrefslogtreecommitdiff
path: root/memoize.clj
blob: ce59edb6bdecdd12c12f008aa2e3c7377584dd50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
;;  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

(clojure/in-ns 'memoize)
(clojure/refer 'clojure)

(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)))))