[Maxima] compilation of tail recursive functions
van.Nek at gmx.net
van.Nek at gmx.net
Thu Feb 16 12:42:26 CST 2006
Am 15 Feb 2006 um 18:55 hat van.Nek at gmx.net geschrieben:
> Hello all,
> I have recognized, that at Maxima-level the compiler does not make a tail recursive call
> optimization, at Lisp-level the compiler does.
> Is there a switch I can set to aim a tail recursive call optimization when compiling?
> (I use Windows-Maxima with GCL)
> Thanks
> Volker van Nek
No answer? OK, I try to be more precise:
(C1) n_sum_1(n,res):=
if n=0 then res
else n_sum_1(n-1,n+res)$
(C2) n_sum_1(1000,0); ---> Bind stack overflow.
(C3) compile_file( "C:\\home\\maxima\\test.mc");
(C4) load( "C:\\home\\maxima\\test.o");
(C6) n_sum_1(10000,0); ---> Bind stack overflow.
That means: Compiling doesn't help. No tail call optimization occurred.
I looked at the translated code:
(PROGN
(DEFPROP $N_SUM_1 T TRANSLATED)
(ADD2LNC '$N_SUM_1 $PROPS)
(DEFMTRFUN ($N_SUM_1 $ANY MDEFINE NIL NIL) ($N $RES)
(DECLARE (SPECIAL $RES $N))
(COND
((LIKE $N 0) $RES)
(T ;(SIMPLIFY <--- I commented out SIMPLIFY
(MFUNCTION-CALL $N_SUM_1 (ADD* $N -1) (ADD* $N $RES))))));)
( NOW this is a tail recursive function again )
and compiled again ---> Tail-recursive call of $N_SUM_1 was replaced by iteration.
loaded again
(C12) n_sum_1(100000000,0); ---> no problem
(D12) 5000000050000000
any ideas??
what is the need of SIMPLIFY there?
is there any possibility to aim tail recursion optimization?
Thanks
Volker van Nek
More information about the Maxima
mailing list