Недавно я пришел через ключевое слово yield
в Python (а также JavaScript). Я понимаю, что это primarliy используется для шаблона генератора, но конструкция языка, похоже, используется в асинхронных функциях, а также где мои интересы лежат, В асинхронных функциях он может просто действовать как синтаксический сахар, и я знаю, что существуют альтернативные шаблоны для достижения такого же эффекта. Но мне это нравится - ЛЕТ!
Я хочу знать, могу ли я сделать что-то подобное в C (даже с встроенной сборкой). Я наткнулся на реализацию Java, используя потоки https://github.com/mherrmann/java-generator-functions, которые я могу более или менее реализовать на C. Однако это не будет самостоятельной реализацией, и мой интерес чисто в самостоятельной реализации.
Приходя к C-подпрограммам (http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html), один из недостатков заключается в том, что объекты стека не могут использоваться. Однако я все еще в порядке, поскольку текущие асинхронные реализации обратного вызова также не могут использовать стек. Однако проблема заключается в самостоятельной реализации - я не могу придумать способ сбора всех переменных регистра и сохранения их без размещенной среды.
Возможно, существует решение с использованием setjmp/longjmp
, однако я уверен, что они не могут быть реализованы отдельно.
Итак, вопрос: возможно ли реализовать функциональность выхода Python в автономном C?
Лично я думаю, что исчерпал возможности, поэтому я попрошу об этом. Если бы у вас была хостинг-реализация, как бы вы ее реализовали (желательно с помощью некоторой макромагии)? У меня довольно уродливая реализация, которую я буду публиковать позже, если ничего не придет.
Также я не хочу реализаций С++. Если вы не можете обернуть С++ чистыми функциями C.
EDIT: Основное требование состоит в том, что функция генератора должна быть повторно введена.