The problem with is that I need to execute the same function with different bindings each time. So caching won't help me For example I need to do something like:
(dotimes [_ 1000] (intern 'user 'x (rand)) (eval '(prn (+(* x x) 5)))) On Dec 21, 11:53 pm, AlexK <alexander.konstanti...@informatik.haw- hamburg.de> wrote: > What eval does, is wrapping (fn* [] <expression>) around its > arguments, compiling that, and calling the resulting function object > (except if your list starts with a 'do or a 'def). > > While Clojure's compiler is pretty fast, you should try not to use > eval. If you want to pass code around you should try something like > storing functions in a map or something similar. > > If you think that you have to eval lists, try wrapping them in (fn > [] ...) and eval that form instead. You'll get a function object which > was compiled once, but can be called as many times as you want. > > eg. > > (defn form->fn [list-to-eval] > (eval (list 'fn [] list-to-eval))) ;this returns a fn > > (def form->fn (memoize form->fn)) ;caches the resulting fns, beware of > memory leaks though > > ((form->fn '(println "Hello World"))) > ((form->fn '(println "Hello World"))) > ((form->fn '(println "Hello World"))) ; should compile only once > > Alex -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en