Compartir a través de


Core1: Iterators

[This post is part of a series, "wish-list for future versions of VB"]

 

IDEA: Add Iterators to VB. But don’t do them like C#; instead do them as “anonymous iterators”, as described by Paul Vick: https://www.panopticoncentral.net/archive/2008/08/08/24155.aspx

    Function FromTo(low As Integer, high As Integer) As IEnumerable(Of Integer)

        If low > high Then Throw New ArgumentException("low>high")

        Return Iterator

                   If low <= high Then

                       Yield low

                   Else

                       Yield Each FromTo(low + 1, high)

                   End If

               End Iterator

    End Function

One feature of this is that you can do argument-validation before returning the iterator; C# users currently have to write two methods, an outer one which validates and an inner one which is the iterator.

Another feature is to use a “Return Each” construct, rather than having to return each one individually.

 

SCENARIO: Iterators are just generally useful. As we rewrite the VB compiler and IDE from C++ into VB, we find ourselves needing iterators all the time. They would make it easier to do LINQ and a whole load of tree-like data-structures.

 

At PDC09, Luca Bolognese’s talk “Future Directions for VB and C#” touched on Async (jump to the 40 minute mark). I’ll blog about async ideas in a week (“Power2: Async and Resumable Methods”). For now, it’s worth nothing that Async and Iterators are both examples of “delayed-execution iterative code blocks” and should probably both be implemented with exactly the same machinery under the hood.

Eric Lippert has blogged about the scope of variables in a For loop: I’ll also blog about that in a week (“Req1: put loop control variable inside loop”). For now, I’ll just say that we should probably fix the for-loop-scope along with iterators.

 

Provisional evaluation from VB team: This is a decent idea, one that we should consider against the other decent ideas.

Comments

  • Anonymous
    January 28, 2010
    The comment has been removed
  • Anonymous
    January 28, 2010
    The comment has been removed
  • Anonymous
    January 31, 2010
    The comment has been removed
  • Anonymous
    February 24, 2010
    I think this is a good idea, though I wonder if it should be End Return rather than End Iterator.  After all, Do While and Do Until are followed by End Do, not End While and End Until, and For Each is followed by Next, not End Each.  It seems to be the first word of the combination that determines what comes at the end.