[Maxima] how to print algebraic expressions as an S-expression which is valid CL code
Barton Willis
willisb at unk.edu
Sat Apr 11 11:15:42 CDT 2009
Here are two possibilities.
(1) Use Maxima's translator: Create a file xxx.mac
f(chi,rho,lw,lf):= (
mode_declare([chi, rho, lw, lf], float),
((chi*lf+chi)*rho+(1-chi)*lw+chi*lf+1)/((chi*lf+chi)*rho+(lf+chi)*lw
+(1-chi)*lf));
>From a Maxima command line, translate the file using the command
> translate_file("xxx.mac");
The file xxx.LISP contains the Lisp code you want (the mode_declare is
important).
(2) Use the *light-weight* Maxima to CL translator:
<...deleted...>
(%o6) ((chi*lf+chi)*rho+(1-chi)*lw+chi*lf+1)/((chi*lf+chi)*rho+(lf+chi)*lw
+(1-chi)*lf)
(%i22) load("tocl")$
(%i23) to_cl(%o6);
(/ (+ (* (+ (* CHI LF) CHI) RHO) (* (+ 1 (- CHI)) LW) (* CHI LF) 1)
(+ (* (+ 1 (* -1 CHI)) LF) (* (+ CHI LF) LW)
(* (+ CHI (* CHI LF)) RHO)))
If to_cl doesn't do exactly what you want, it's fairly easy to modify
the to_cl translator, I think.
Barton
-----maxima-bounces at math.utexas.edu wrote: -----
>How can I print algebraic expressions as an S-expression which is
>valid Common Lisp code? For example,
>
>eq1: 1-rho*chi*(mu-1)=lw*beta*mu+q;
>eq2: q=lf*(1-beta)*mu;
>eq3: chi*(mu+1)=beta*mu+1-q;
>
>sol:solve([eq1, eq2, eq3], [mu,q,beta]);
>
>rhs(sol[1][1]); /* how to emit this as an S-expression? */
>
>gives
>
> (chi lf + chi) rho + (1 - chi) lw + chi lf + 1
>-------------------------------------------------
>(chi lf + chi) rho + (lf + chi) lw + (1 - chi) lf
>
>and I would like to have
>
>(/ (+ (* (+ (* chi lf) chi) rho) ...
>
More information about the Maxima
mailing list