После прочтения Eric Lippert’s answer У меня сложилось впечатление, что await
и call/cc
- это почти две стороны одной и той же монеты, с большинством синтаксических различий. Однако, пытаясь на самом деле реализовать call/cc
в C# 5, у меня возникла проблема: либо я неправильно понимаю call/cc (что вполне возможно), либо ждет только reminiscent call/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"
Если мое понимание вызова/куб.см правильно, то это должно напечатать:
Before
Result: stuff
Done
Кардинально, когда продолжение называется, программа состояние восстановлено вместе с историей звонков, так что foo
возвращается в main
и никогда не возвращается к bar
.
Однако, если реализовано с использованием await
в C#, вызов продолжения не восстановить эту историю звонков. 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, никогда не дает нам объект продолжения, чтобы передать значение, общее сходство весьма впечатляющая. За исключением того, что на этот раз совершенно очевидно, что «After» никогда не вызывается, в отличие от примера с истинным вызовом/cc, что является еще одной причиной любить C# и хвалить его дизайн!
Timwi правильный; ожидание больше похоже на вызов «local effect»/cc; это тонкость, о которой я не думал кричать в своем первоначальном ответе. Я обновил его. –