samer@4: % tail_feval - Call function with tail recursion samer@4: % samer@4: % tail_feval :: (A{1:N}->rthunk(B{1:M}), A{1:N} -> B{1:M}. samer@4: % samer@4: % rthunk(B{1:M}) ::= samer@4: % exists C{1:L} . cell { C{1:L} -> rthunk(B{1::}), C{1:L} }. samer@4: % | cell { {0}, cell { B{1:L} } } samer@4: function varargout=tail_feval(fn,varargin) samer@4: ret=fn(varargin{:}); samer@4: while ~isnumeric(ret{1}) samer@4: ret=feval(ret{1},ret{2}{:}); samer@4: end samer@4: varargout=ret{2}(1:nargout); samer@4: end samer@4: samer@4: