Elixirで無限ループしたい時、どうしますか?
たぶん、再帰で実現することになると思います。
この記事を書いた
LEDの点滅では、点滅を無限に繰り返したかったので、次のようにしています。
defp toggle_pin_forever(output_gpio) do
GPIO.write(output_gpio, 1)
GPIO.write(output_gpio, 0)
toggle_pin_forever(output_gpio)
end
C言語だったら、これってやっちゃダメな典型で、すぐにスタックオーバフローします。
この無限ループって、スタックオーバフローしないのか?
Elixirは関数呼び出しの時にスタック不要な仕組みになってるのか?
と疑問がいっぱい。
末尾再帰の場合はスタックを消費しない仕組みになってるからでした。
ああ。なるほど。これで安心して無限ループできます。
この記事に、Stack overflowするElixirのプログラムをつけようと思ったんですが、発生させられませんでした。
発生できたら、追記します!
末尾再帰を使って最適化する記事があったので、参考にリンクを付けておきます。