Hail2u.net

Sassでの関数の再帰呼び出し

ちょっとした事情で20回ほど再帰呼び出しする関数をSassで書いたらコンパイラーが落ちた。これは単に関数にバグがあっただけだった。100回程再帰呼び出しする関数を書いてみたが、これは落ちた……と思ったらこれも間違えて無限ループさせてただけだった……。ちゃんと書いてちゃんと限界を確認した。

以下のようなテスト・コードを書き、$maxを書きかえて限界を探った。

$initial: 0;
$max: 302;

@function loop($i) {
  $i: $i + 1;

  @if ($i < $max) {
    @return loop($i);
  } @else {
    @return $i;
  }
}

.test {
  z-index: loop($initial);
}

コンパイラーが落ちず、出力されるCSSでz-indexプロパティーの値が$initial + $maxと等しくなれば良い。手元の環境(Sass v3.4.9)では302までは問題なく通り、303にするとstack level too deep (SystemStackError)で落ちた。

再帰呼び出しの内容にもよるかもしれないが、数十回くらいまでなら再帰呼び出ししても問題なさそうだ。