Garbage collector ([info]softmaster) wrote,
@ 2009-06-26 09:45:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
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?


Advertisement


(Read 13 comments)

Post a comment in response:

From:
(will be screened)
Help(will be screened)
Identity URL: 
Username:
Password:
Don't have an account? Create one now.
Subject:
No HTML allowed in subject
   Help
Message:

 
Notice! This user has turned on the option that logs IP addresses of anonymous posters. Help
Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…