samer@4: % tail1 - Call function with tail recursion samer@4: % samer@4: % tail1 :: (A{1:N}->thunk(B{1:M}), A{1:N} -> B{1:M}. samer@4: % samer@4: % thunk(B{1:M}) ::= samer@4: % exists C{1:L} . cell { C{1:L}->B{1:M}, cell { C{1:L} } } samer@4: % | cell { {0}, cell { B{1:L} } } samer@12: % | void -> B{1:M}. samer@4: samer@4: function varargout=feval_tail1(fn,varargin) samer@4: ret=fn(varargin{:}); samer@4: if ~isnumeric(ret{1}) samer@4: [varargout{1:nargout}]=feval(ret{1},ret{2}{:}); samer@4: else samer@4: varargout=ret{2}(1:nargout); samer@4: end samer@4: end samer@4: samer@4: