Phlex wrote:
> How about compiling a closure tree ?
>
> ;; very basic example follows
>
> (defn make+ [param1 param2]
>   (fn [environement]
>     (+ (param1 environement) (param2 environement))))
>
> (defn make* [param1 param2]
>   (fn [environement]
>     (* (param1 environement) (param2 environement))))
>
> (defn make-variable [variable-name]
>   (fn [environement]
>     (environement variable-name)))
>
> (defn make-number [number]
>   (fn [environement]
>     number))
>
> (def *mappings* {'+ make+
>          '* make*})
>
> (defn my-compile [expression]
>   (cond
>    (seq? expression) ((*mappings* (first expression))
>               (my-compile (nth expression 1))
>               (my-compile (nth expression 2)))
>    (number? expression) (make-number expression)
>    (symbol? expression) (make-variable expression)))
>
> (defn test-it []
>   (let [compiled (my-compile '(+ (* a 2) (+ b a)))]
>     (map compiled (list {'a 0 'b 0}
>             {'a 1 'b 2}
>             {'a 2 'b 1}
>             {'a 4 'b 5}))))
>
> cara.data.expressions=> (time (dotimes [a 1000000] (test-it)))
> "Elapsed time: 3160.461437 msecs"   
>
>   
The test should of course be

cara.data.expressions=> (time (dotimes [a 1000000] (doall (test-it))))
"Elapsed time: 5436.411073 msecs"

without the doall, the lazy sequence does not get evaluated !

Sacha



--~--~---------~--~----~------------~-------~--~----~
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
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