forked from kanaka/mal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
memoize.mal
25 lines (21 loc) · 933 Bytes
/
memoize.mal
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
;; Memoize any function.
;; Implement `memoize` using an atom (`mem`) which holds the memoized results
;; (hash-map from the arguments to the result). When the function is called,
;; the hash-map is checked to see if the result for the given argument was already
;; calculated and stored. If this is the case, it is returned immediately;
;; otherwise, it is calculated and stored in `mem`.
;; For recursive functions, take care to store the wrapper under the
;; same name than the original computation with an assignment like
;; `(def! f (memoize f))`, so that intermediate results are memorized.
;; Adapted from http://clojure.org/atoms
(def! memoize
(fn* [f]
(let* [mem (atom {})]
(fn* [& args]
(let* [key (str args)]
(if (contains? @mem key)
(get @mem key)
(let* [ret (apply f args)]
(do
(swap! mem assoc key ret)
ret))))))))