Hi,
You can use expresso <https://github.com/clojure-numerics/expresso> for
this:
(use 'numeric.expresso.core)
(def e (ex (+ 8 a (* 9 (+ 2 b)) 2)))
;=> (+ 8 a (* 9 (+ 2 b)) 2)
This expression can now be manipulated by expresso to
simplify it, solve it, etc.
you can substitute a and b for its values when you know them and then
evaluate
(evaluate (substitute e '{a 1 b 2})) (or (evaluate e '{a 1 b 2}) which is
equivalent)
;=> 47
But I think you are searching for compile-expr which turns the expression
to a efficient clojure function taking the arguments
((compile-expr [a b] (+ a b)) 1 2) ;=> 3
In your example, you can get the partial evaluate behaviour by using
optimize on the expression beforehand. optimize will do several
transformations one of them is constant merging:
(optimize e) ;=> (+ 10 a (* 9 (+ 2 b)))
which can the compiled by compile-expr* (the function equivalent)
(def partial-evaluated (compile-expr* '[a b] (optimize e)))
(partial-evaluated 1 2) ;=> 47

Hope this helps
M*aik*




On Sat, Jun 14, 2014 at 1:43 AM, Christopher Small <metasoar...@gmail.com>
wrote:

> There is a nice example of something similar to this in Joy of Clojure
> (2nd edition anyway; not sure about first). It only shows you how to do
> contextual-evaluation, and doesn't return a function if some set of the
> symbols are not mapped in the context, but I'll bet you could modify the
> example to infer when one of the variables is missing in the context
> specification, and return a function in that case. It is right at the
> beginning of the section on macros. Good book, BTW.
>
> Can maybe share more later if you aren't interested in getting the book or
> need more guidance on this.
>
> Chris
>
>
>
> On Friday, June 13, 2014 2:46:56 PM UTC-7, Dilvan wrote:
>>
>>    Hi all,
>>
>>    I'm a novice to Clojure (but not to programming).
>>    I'm looking for an implementation of an eval function to eval
>> expression like Mathematica does.
>>    For instance, in Mathematica the expression:
>>
>>    8 + a + 9 (2 + b) + 2
>>
>>    if a and b are not bound, translates to
>>
>> Plus[10, a, Times[9, Plus[2, b]]]
>>
>>    if a and b become bounded later (let say to 1 and 2) and the
>> expression is evaluated again, it returns 47.
>>
>>    I would like to be able to run:
>>      (eval-partial '(+ (+ 8 2) a (* 9 (+ 2 b))))
>>    and get, if a and b are unbound:
>>      (fn [x y] (+ 10 x (* 9 (+ 2 y))))
>>    or (better still)
>>          ['(a b) (fn [x y] (+ 10 x (* 9 (+ 2 y))))]
>>    Notice that, whenever possible, the eval takes place and parts of the
>> expression are evaluated (in the example above, the expression (+ 8 2) is
>> evaluated to 10).
>>
>>    If you know of any implementation or have any ideas on the subject,
>> please let me know.
>>
>>    Cheers,
>> Dilvan.
>>
>>
>  --
> 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
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to