Какой бренд сопрограмм реализует Lua?

Может ли кто-нибудь конкретно сказать мне, какой «вкус» реализует Lua сопрограмм? Я спрашиваю, потому что сопрограммы Lua, кажется, хорошо подходят для моей проблемы, когда я хочу иметь возможность приостанавливать функцию в различных точках, возможно, внутри вызовов вложенных функций, а затем возобновлять ее позже. Несмотря на наличие аналогичных конструкций, подобных "сопрограмме / генератору", это не представляется возможным, например, в C # или JavaScript. Какие еще языки поддерживают эти типы сопрограмм?


person Chris_F    schedule 29.12.2018    source источник
comment
Прочтите конец этой страницы   -  person Egor Skriptunoff    schedule 29.12.2018
comment
ТБХ, мой вывод из чтения заключается в том, что нет двух одинаковых сопрограмм, и ни один язык не подходит для их описания ...   -  person Chris_F    schedule 29.12.2018


Ответы (1)


В свободно доступной статье Coroutines in Lua говорится:

Lua реализует концепцию асимметричных сопрограмм, которые обычно обозначаются как полусимметричные или полупрограммы [Marlin, 1980], [Dahl et al., 1972] ]. Средства асимметричных сопрограмм называются так потому, что они включают в себя два типа операций передачи управления: один для (повторного) вызова сопрограммы и второй для ее приостановки, причем последний возвращает управление вызывающей сопрограмме. Асимметричную сопрограмму можно рассматривать как подчиненную по отношению к вызывающей стороне, причем отношения между ними аналогичны отношениям между вызываемой и вызывающей подпрограммами. Другая дисциплина управления реализуется с помощью средств симметричной сопрограммы, которые обеспечивают единую операцию передачи для переключения управления на указанную сопрограмму. Поскольку симметричные сопрограммы могут передавать управление между собой, говорят, что они работают на одном иерархическом уровне. Следующие аргументы оправдывают, почему Lua предлагает асимметричные сопрограммы вместо предоставления симметричных возможностей или обоих механизмов.

person lhf    schedule 30.12.2018