Eric Lippertの答えを読んだ後、私は、ほとんど同じコインの両面であり、多くても構文上の違いがawait
あるという印象を受けました。call/cc
しかし、実際にC#5で実装しようとするとcall/cc
、問題が発生しました。call/ ccを誤解しているか(かなり可能です)、またはwaitはcall/ccを彷彿とさせるだけです。
次のような擬似コードを検討してください。
function main:
foo();
print "Done"
function foo:
var result = call/cc(bar);
print "Result: " + result;
function bar(continuation):
print "Before"
continuation("stuff");
print "After"
call / ccの私の理解が正しければ、これは次のように出力されます。
Before
Result: stuff
Done
重要なのは、継続が呼び出されると、プログラムの状態が呼び出し履歴とともに復元されるため、にfoo
戻り、に戻るmain
ことはないということbar
です。
ただし、C#でを使用して実装されている場合await
、継続を呼び出してもこの呼び出し履歴は復元されません。foo
に戻り、正しい通話履歴を継続の一部にするために使用bar
できる方法はありません(私が見ることができます) 。await
説明してください:私はの操作を完全に誤解しましたかcall/cc
、それともawait
まったく同じではありませんcall/cc
か?
答えがわかったので、それらをかなり類似していると考えるのには十分な理由があると言わざるを得ません。上記のプログラムが疑似C#-5でどのように見えるかを考えてみましょう。
function main:
foo();
print "Done"
async function foo:
var result = await(bar);
print "Result: " + result;
async function bar():
print "Before"
return "stuff";
print "After"
したがって、C#5スタイルでは、値を渡すための継続オブジェクトが提供されることはありませんが、全体的な類似性は非常に印象的です。今回は、true-call / ccの例とは異なり、「After」が呼び出されないことは明らかです。これは、C#を愛し、そのデザインを称賛するもう1つの理由です。