Я изучаю сопрограммы и генераторы на разных языках программирования.
Мне было интересно, есть ли более чистый способ объединить вместе две сопрограммы, реализованные с помощью генераторов, чем возвращать вызывающему объекту все, что дает вызываемый?
Допустим, мы используем следующее соглашение: все результаты, кроме последнего, возвращают ноль, а последний возвращает результат сопрограмма. Так, например, у нас может быть сопрограмма, которая вызывает другую:
def A():
# yield until a certain condition is met
yield result
def B():
# do something that may or may not yield
x = bind(A())
# ...
return result
в этом случае я хочу, чтобы через привязку (которая может быть или не может быть реализована, вот в чем вопрос) сопрограмма B дает результат всякий раз, когда A дает результат, пока A не вернет свое окончательное result, который затем присваивается x, позволяя B продолжить.
Я подозреваю, что реальный код должен явно повторять A так:
def B():
# do something that may or may not yield
for x in A(): ()
# ...
return result
что немного уродливо и подвержено ошибкам ...
PS: это для игры, в которой пользователями языка будут дизайнеры, которые пишут скрипты (скрипт = сопрограмма). У каждого персонажа есть связанный сценарий, и есть много дополнительных сценариев, которые вызываются основным сценарием; учтите, что, например, run_ship многократно вызывает rich_closest_enemy, fight_with_closest_enemy, flee_to_allies и так далее. Все эти подпрограммы необходимо запускать так, как вы описали выше; для разработчика это не проблема, но для дизайнера, чем меньше кода нужно написать, тем лучше!