Eric Lippert’s answerを読んだあと、await
とcall/cc
はほとんどの構文上の違いを除いて同じコインのほぼ2つの側面であるという印象を受けました。しかし、実際にC#5にcall/cc
を実装しようとすると、私はcall/cc(これはかなり可能です)を誤解していたか、またはというコール/ ccを思い出してしまいます。C#は継続性を待っています:全く同じではありませんか?
は、このような擬似コードを考えてみましょう:
function main:
foo();
print "Done"
function foo:
var result = call/cc(bar);
print "Result: " + result;
function bar(continuation):
print "Before"
continuation("stuff");
print "After"
コール/ 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スタイルは、全体的な類似性が非常に印象的で、に値を渡すために私たちに継続オブジェクトを与えることはありませんしながら。この時間を除いて、C#を愛し、そのデザインを賞賛する別の理由である、本当のコール/ ccの例とは違って、 "After"が呼び出されないことは全く明らかです!
Timwiは正しいです。 awaitは "local effect" call/ccのようなものです。これは私が元の答えで呼ぶとは思わなかった微妙なことです。私はそれを更新しました。 –