Недавно я пришел через ключевое слово yield
в Python (а также JavaScript). Я понимаю, что это primarliy используется для шаблона генератора, но конструкция языка, похоже, используется в асинхронных функциях, а также где мои интересы лежат. В асинхронных функциях он может просто действовать как синтаксический сахар, и я знаю, что существуют альтернативные шаблоны для достижения того же эффекта. Но мне это нравится - ЛЕТ!Возможно ли реализовать функциональность выхода Python в автономном режиме C?
Я хочу знать, могу ли я сделать что-то подобное в 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++ - если вы не можете обернуть C++ чистыми функциями C.
РЕДАКТИРОВАНИЕ: Основное требование состоит в том, чтобы функция генератора должна была повторно вводиться.
Учитывая, что интерпретатор Python написан на языке C ... да? – chepner
Я так не думаю. Вам либо нужна стандартная библиотека (которая реализует 'setjmp' и' longjmp'), либо вам нужно выполнить некоторые конкретные операции с оборудованием, наиболее вероятно связанные с сборкой. Просто, как вам это нужно? – mtijanic
@mtijanic Специальные операции оборудования - это хорошо. Я хочу - если бы я мог модифицировать компилятор С и ввести синтаксис урока, тогда этот синтаксис должен быть доступен на первом этапе компиляции компилятора (когда он может скомпилировать только автономный код). Он не должен зависеть от каких-либо конкретных функций ОС, например, при создании второй фазы компилятора. Не уверен, что то, что я только что сказал, имеет смысл для любого. – tinkerbeast