Erlangで最適化された末尾呼び出しではない関数でスタックオーバーフローを取得することは可能ですか? たとえば、このような関数があるとします
sum_list([],Acc) ->
Acc;
sum_list([Head|Tail],Acc) ->
Head + sum_list(Tail, Acc).
十分な大きさのリストが渡された場合、最終的にスタック スペースが不足してクラッシュするように思われます。私はこれを次のようにテストしてみました:
> L = lists:seq(1, 10000000).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 23,24,25,26,27,28,29|...]
> sum_test:sum_list(L, 0).
50000005000000
しかし、それは決してクラッシュしません!100,000,000 個の整数のリストで試してみましたが、完了するまでに時間がかかりましたが、クラッシュすることはありませんでした! 質問:
- これを正しくテストしていますか?
- もしそうなら、スタックオーバーフローを生成できないのはなぜですか?
- Erlang は、スタックオーバーフローの発生を防止する何かを行っていますか?