Skip to content

Instantly share code, notes, and snippets.

@lagenorhynque
Last active September 22, 2016 23:39
Show Gist options
  • Save lagenorhynque/b289febfe9c30821be73ce57b8c4f5e7 to your computer and use it in GitHub Desktop.
Save lagenorhynque/b289febfe9c30821be73ce57b8c4f5e7 to your computer and use it in GitHub Desktop.
;;;; cf. http://riktor.hatenablog.com/entry/2012/07/22/223937
(def counter
(let [cnt (atom 0)]
(fn [] (swap! cnt inc))))
(counter)
(counter)
(counter)
(defn make-counter []
(let [cnt (atom 0)]
(fn [] (swap! cnt inc))))
(def counter1 (make-counter))
(def counter2 (make-counter))
(counter1)
(counter1)
(counter1)
(counter2)
(counter2)
(counter1)
(def counter
(let [cnt (atom 0)]
(fn [msg & [arg]]
(let [delta (or arg 1)]
(case msg
:inc (swap! cnt + delta)
:dec (swap! cnt - delta))))))
(counter :inc)
(counter :inc 2)
(counter :dec)
(counter :dec 2)
(sort (let [cnt (atom 0)]
(fn [a b]
(println (swap! cnt inc))
(< a b)))
'(1 33 4 -2 3 1 432))
(defmacro defn-memoized [fn-name args & body]
`(let [memo# (atom {})]
(defn ~fn-name [~@args]
(if-let [n# (get @memo# [~@args])]
n#
(let [m# (do ~@body)]
(swap! memo# assoc [~@args] m#)
m#)))))
(defn-memoized fib-memoized [n]
(if (or (= n 0) (= n 1))
1
(+ (fib-memoized (- n 1))
(fib-memoized (- n 2)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment