call/cc
ラムダとクロージャだけで実装できるかどうか誰かが知っていますか?
プログラムのフローを(例外のように)中断するようですcall/cc
が、ラムダとクロージャはそれを行うことができません。call/cc
したがって、ラムダとクロージャを介して実装することはできないと思います。
他にアイデアはありますか?
call/cc
ラムダとクロージャだけで実装できるかどうか誰かが知っていますか?
プログラムのフローを(例外のように)中断するようですcall/cc
が、ラムダとクロージャはそれを行うことができません。call/cc
したがって、ラムダとクロージャを介して実装することはできないと思います。
他にアイデアはありますか?
「ラムダとクロージャだけで実装された」とは正確にはどういう意味なので、質問は特に明確ではありません。
いずれの場合も、継続渡しスタイルで手動で記述することにより、クロージャを含む任意の言語で継続を使用できます。次に、この形式への自動翻訳は、コンパイラーを拡張することによって実装できます。これは、Lispsが通常マクロを介してユーザーレベルで許可します。たとえば、Common Lispの継続を実装するライブラリであるcl-contを参照してください。これは、それらが組み込まれていない言語です。
Schemeのような効率的な普及継続は、プログラムスタックを直接処理する下位レベルで実装される可能性がありますが、これは要件ではなく、単なる最適化です。
call/cc
スキームでは、継続渡しスタイル(CPS)に変換するときにラムダを使用して実装できます。CPSに変換する場合、発生するすべてのものをcall/cc
次の同等のものに置き換えることができます。
(lambda (f k) (f (lambda (v k0) (k v)) k))
ここk
で、は保存される継続であり、(lambda (v k0) (k v))
はこの継続を復元するエスケーププロシージャです(k0
呼び出されたときにアクティブな継続はすべて破棄されます)。
だから、Schemeに対するあなたの質問に答えるために:はい、それは行うことができます。