現実には、継続を使用できる便利な状況の多くは、throw / catch、return、C#/Pythonのyieldなどの特殊な言語構造ですでにカバーされています。したがって、言語の実装者は、独自のソリューションに使用できる一般化された形式でそれらを提供するインセンティブをあまり持っていません。
一部の言語では、一般化された継続を効率的に実装するのは非常に困難です。スタックベースの言語(つまり、ほとんどの言語)は、基本的に、継続を作成するたびにスタック全体をコピーする必要があります。
これらの言語は、基本的なスタックベースのモデルを壊さない特定の継続のような機能を一般的な場合よりもはるかに効率的に実装できますが、一般化された継続を実装することはかなり難しく、価値がありません。
関数型言語は、いくつかの理由で継続を実装する可能性が高くなります。
- これらは継続渡しスタイルで実装されることがよくあります。つまり、「呼び出しスタック」はおそらくヒープに割り当てられたリンクリストです。これにより、現在のフレームをポップして新しいフレームをプッシュするときにスタックコンテキストを上書きする必要がないため、継続としてスタックへのポインタを渡すのは簡単です。(私はCPSを実装したことがありませんが、それは私の理解です。)
- これらは不変のデータバインディングを優先します。これにより、スタックが作成時に指していた変数の内容を変更しないため、古い継続がはるかに便利になります。
これらの理由により、継続はほとんど関数型言語の領域にとどまる可能性があります。