Я использую выход во многих моих программах на Python, и во многих случаях он действительно очищает код. Я написал об этом в блоге, и это одна из моих популярных страниц на сайте.
С# также предлагает выход - он реализуется посредством сохранения состояния в стороне вызывающего абонента, выполняемый автоматически сгенерированным классом, который сохраняет состояние, локальные переменные функции и т.д.
В настоящее время я читаю о С++ 0x и его добавлениях; и, читая о реализации lambdas в С++ 0x, я узнал, что это было сделано и с помощью автоматически созданных классов, оснащенных operator(), хранящими лямбда-код. Естественный вопрос сформировался в моем сознании: они сделали это для лямбда, почему они тоже не рассматривали его для поддержки "урожая"?
Конечно, они могут видеть значение co-подпрограмм... поэтому я могу только догадываться, что они думают о реализации на основе макросов (таких как Simon Tatham's) в качестве адекватной замены. Тем не менее, они не по многим причинам: состояние, поддерживаемое людьми, не реентеративное, основанное на макроуровне (это само по себе достаточно) и т.д.
Изменить: yield
не зависит от сбора мусора, потоков или волокон. Вы можете прочитать статью Саймона, чтобы увидеть, что я говорю о компиляторе, выполняющем простое преобразование, например:
int fibonacci() {
int a = 0, b = 1;
while (true) {
yield a;
int c = a + b;
a = b;
b = c;
}
}
В:
struct GeneratedFibonacci {
int state;
int a, b;
GeneratedFibonacci() : state (0), a (0), b (1) {}
int operator()() {
switch (state) {
case 0:
state = 1;
while (true) {
return a;
case 1:
int c = a + b;
a = b;
b = c;
}
}
}
}
Сбор мусора? Нет. Нет. Волокна? Нет. Простое преобразование? Возможно, да.