На википедии есть некий
пример сопрограмм. Если привести его в более сиподобный вид, то получится примерно следующее:
Queue q(20);
void produce()
{
for(;;)
{
while (!q.IsFull())
{
Item item = Gen();
q.Add(item);
}
yield consume;
}
}
void consume()
{
for(;;)
{
while (!q.IsEmpty())
{
Item item = q.Extract();
Use(item);
}
yield produce;
}
}
Есть две функции, которые могут где-то сохранять свое состояние и передавать друг другу управление напрямую, без вызова функции. Оператор yield делает нечто, что сохраняет состояние первой функции, переключается на вторую и восстанавливает состояние второй. Желательно, чтобы это нечто было достаточно низкоуровневым и эффективным, с тем чтобы данный оператор можно было применять где угодно, в том числе при программировании embedded софта и т.п. То есть никаких фреймворков нет, есть как-бы "голый си" (некий разрабатываемый си-подобный язык).
Интересно, как можно такую фичу грамотно спроектировать при разработке собственного языка программирования?
Какие требования, ограничения к сопрограммам должны предъявляться? Любые ли две функции можно сделать сопрограммами, или только удовлетворяющие какому-то общему требованию?
В общем, любые мысли приветствуются.