| Garbage collector ( @ 2009-06-26 09:45:00 |
| Current mood: | artistic |
reverse yield
в цэшарпе есть замечательный стейтмент - yield return.
метод типа
IEnumerable<int> test()
{
yield return 2;
yield return 3;
yield return 5;
yield break;
}
на самом деле генерит небольшую state machine, которая вызывается на каждой итерации в foreach(int a in test()), что очень полезно в плане lazy evaluation.
посмотрим на другой код:
void testIn(IEnumerable<int> src)
{
var iter = src.GetEnumerator();
while(iter.MoveNext() )
{
out1.WriteLine("{0}", iter.Current);
if (iter.MoveNext())
out2.WriteLine("{0}", iter.Current);
}
}
хотелось бы вызывать его таким образом
testIn(1); // а ещё лучше testIn <= 1
// do something
testIn(2);
// do something else
testIn( EOF ); // end of file %)
т.е. заставить компилер применять ту же логику, что и в первом случае.
ещё неплохо было бы иметь синтаксис этакого push iterator с yield ом наоборот:
void testIn2(IEnumerable<int> src)
{
while(true)
{
out1.WriteLine("{0}", yield acquire src);
out2.WriteLine("{0}", yield acquire src);
}
}
где yield "ждёт", пока подсунут ещё данных, или "выходит", если подсунули EOF.
В идеале, хотелось бы средства языка для генерации произвольных стейт машин, не только енумераторов.
Никто не знает, может где-то это есть? может монады в хаскеле так и работают?
интересно, MS принимает идеи для C# 5.0?