public static EObject apply_list_last(EProc proc, EObject mod, EObject fun, ESeq seq, int len) throws Pausable { EAtom f = fun.testAtom(); ESeq a = seq.testSeq(); if (f == null || a == null) throw ERT.badarg(mod, fun, seq); EFun found = resolve_fun(mod, fun, len); if (len > 9) { // TODO: make it real tail recursion in stead return found.invoke(proc, a.toArray()); } proc.tail = found; a = a.reverse(); switch (len) { default: throw new NotImplemented(); case 9: proc.arg8 = a.head(); a = a.tail(); case 8: proc.arg7 = a.head(); a = a.tail(); case 7: proc.arg6 = a.head(); a = a.tail(); case 6: proc.arg5 = a.head(); a = a.tail(); case 5: proc.arg4 = a.head(); a = a.tail(); case 4: proc.arg3 = a.head(); a = a.tail(); case 3: proc.arg2 = a.head(); a = a.tail(); case 2: proc.arg1 = a.head(); a = a.tail(); case 1: proc.arg0 = a.head(); a = a.tail(); case 0: } return EProc.TAIL_MARKER; }