この記事は Crystal Advent Calendar 2018 の17日目の記事です。
この度、CrystalでServer-Sent Eventsを使うためのライブラリ sse.cr を書きました!
標準ライブラリで提供されているHTTP::WebSocketと同じような使い方ができるようになっています。
このライブラリを書く際、サーバから延々とプッシュされてくるイベントを末尾再帰を使って処理するよう実装していたのですが、ある程度の回数を実行したところでのようなエラーが...
Stack overflow (e.g., infinite or very deep recursion)
[0x102d15077] *CallStack::print_backtrace:URI +39
[0x102d15020] __crystal_sigfault_handler +96
[0x7fff7d40cb3d] _sigtramp +29
[0x102d15038] *run<URI>:Nil +8
[0x102d1503c] *run<URI>:Nil +12 (524147 times)
[0x102cf9f81] __crystal_main +4593
[0x102cfda2b] main +43
結局、末尾再帰を使って実装していた部分をループに書き換えたのですが、CrystalのIssuesを見るかぎり、末尾再帰の最適化はCrystalでは実装されてない(される予定もない)ようです。
意外でした。