foreach, an analogy
Chris Nicholson-Sauls
ibisbasenji at gmail.com
Wed Oct 25 20:49:00 PDT 2006
Benji Smith wrote:
> clayasaurus wrote:
>
>> Here is my view on foreach_reverse
>>
>> 1) I really like the idea of foreach being the defacto-iterator for D
>
>
> Me too.
>
>> 2) foreach_reverse allows me to implement an opApply function to my
>> doubly linked list template for not only forward iteration, but
>> backwards iteration as well! Otherwise, I'd have to pass it a
>> &list.reverse delegate which is hackish.
>
>
> In C#, the foreach construct operates over arrays or objects that
> implement the IEnumerable<T> interface (which includes the
> ICollection<T> subinterface).
>
> In Java, the "enhanced for loop" operates over arrays or objects that
> implement the Iterable<T> interface (which includes the Collection<T>
> sub-interface).
>
> As far as I'm concerned, each class should be responsible for
> determining which iterators it offers. A doubly-linked list could provide:
>
> DoublyLinkedList.getForwardIterator();
> DoublyLinkedList.getReverseIterator();
>
> Whereas a binary tree might provide even more:
>
> BinaryTree.getInOrderIterator();
> BinaryTree.getReverseOrderIterator();
> BinaryTree.getDepthFirstIterator();
> BinaryTree.getBreadthFirstIterator();
>
> Then, the foreach just iterates through any object that's iterable. Like
> this:
>
> IEnumerable<T> iterator = myBinaryTree.getDepthFirstIterator();
> foreach(T item in iterator) {
> // do stuff with item
> }
Or, using the current situation:
# foreach (item; &myBinaryTree.depthFirstIterator) {
# // do stuff with item
# }
I think that is about as expressive as could be needed?
> A single mechanism for all different kinds of iteration scenarios.
>
> The ECMA C# specification (starting on page 236) gives a thorough
> description of how compilers should implement foreach:
>
> http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
>
> I think it's a very elegant solution.
>
> In D, even overlooking the presence of a fifteen-letter keyword
> ("foreach_reverse"), the ugliest part is the presence of the
> opApplyReverse() method, which suggests that the collection object
> should be responsible for its own iteration, whereas I think iteration
> should be delegated to a separate object.
>
> --Benji Smith
-- Chris Nicholson-Sauls
More information about the Digitalmars-d-announce
mailing list