Delphi : 末尾再帰

まず、普通の再帰

function Sum(N, Accum: Integer): Integer;
  begin
    if N = 0
      then Result := Accum
      else Result := Sum(N-1, Accum+N);
  end;

さて、末尾再帰の最適化については、
http://hp.vector.co.jp/authors/VA028375/delphi/delphipascal_xx_tail.html
で実験しておられますが、人間コンパイラを許すなら、こう書くのが一番シンプル。

function Sum(N, Accum: Integer): Integer;
  label start;
  begin start:
    if N = 0
      then Result := Accum
      else begin
        N := N-1; Accum := Accum+N;
        goto start;
      end;
  end;

で、これを、もうちょっと書き方を変えられないかと考えているのだけれど・・・
こんなので上手くいくかと思ったのだけれど、ダメ。関数の頭で、最適化のため、パラメータが退避させられてしまった。

function Sum(N, Accum: Integer): Integer;
  function _Sum_(N, Accum: Integer): Integer; asm end;
  label start;
  begin start:
    if N = 0
      then Result := Accum
      else begin
        _Sum_(N-1, Accum+N);
        goto start;
      end;
  end;

でもって、考え中。