[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