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