Skip to content

Instantly share code, notes, and snippets.

@viksit
Last active August 29, 2015 14:06
Show Gist options
  • Save viksit/0aa7825cdeba3ff0d6ff to your computer and use it in GitHub Desktop.
Save viksit/0aa7825cdeba3ff0d6ff to your computer and use it in GitHub Desktop.
;; Non recursive function
(defn fib-nr [f]
(fn [n]
(if (< n 2) 1
(+ ((f f) (- n 1))
((f f) (- n 2))))))
;; A U combinator that allows a generic application function
(defn UM [myapply f]
(defn g [v]
(fn [args]
(myapply (f v) args)))
(f g))
;; Memoizer that is generic
(defn make-memoizer []
(let [application-cache (atom {})]
(fn [function args]
(do
(prn "ac" application-cache)
(prn "args" args)
(prn "fn" function)
(if-let [e (find @application-cache args)]
(val e)
(let [result (apply function args)]
(swap! application-cache assoc args result)
result))))))
((UM (make-memoizer) fib-nr) 35); doesn't work - why?
((UM (make-memoizer) fib-nr) 1) ; works
;; Stack trace from the (.. 35) line
java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long
at clojure.lang.RT.seqFrom (RT.java:505)
clojure.lang.RT.seq (RT.java:486)
clojure.core$seq.invoke (core.clj:133)
clojure.core$apply.invoke (core.clj:624)
viksit.explorations$make_memoizer$fn__13555.invoke (form-init7838994634444008614.clj:10)
viksit.explorations$UM$g__13199$fn__13200.invoke (form-init7838994634444008614.clj:4)
viksit.explorations$fib_nr$fn__11066.invoke (form-init7838994634444008614.clj:4)
viksit.explorations$eval13956.invoke (form-init7838994634444008614.clj:1)
clojure.lang.Compiler.eval (Compiler.java:6703)
clojure.lang.Compiler.eval (Compiler.java:6666)
clojure.core$eval.invoke (core.clj:2927)
clojure.main$repl$read_eval_print__6625$fn__6628.invoke (main.clj:239)
clojure.main$repl$read_eval_print__6625.invoke (main.clj:239)
clojure.main$repl$fn__6634.invoke (main.clj:257)
clojure.main$repl.doInvoke (main.clj:257)
clojure.lang.RestFn.invoke (RestFn.java:1096)
clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__591.invoke (interruptible_eval.clj:56)
clojure.lang.AFn.applyToHelper (AFn.java:152)
clojure.lang.AFn.applyTo (AFn.java:144)
clojure.core$apply.invoke (core.clj:624)
clojure.core$with_bindings_STAR_.doInvoke (core.clj:1862)
clojure.lang.RestFn.invoke (RestFn.java:425)
clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:41)
clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__632$fn__635.invoke (interruptible_eval.clj:171)
clojure.core$comp$fn__4192.invoke (core.clj:2402)
clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__625.invoke (interruptible_eval.clj:138)
clojure.lang.AFn.run (AFn.java:22)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)
java.lang.Thread.run (Thread.java:744)
@viksit
Copy link
Author

viksit commented Sep 18, 2014

Finally, this can be fixed by using [function & args] in make-memoizer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment