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

Reply via email to