www.digitalmars.com         C & C++   DMDScript  

D - Custom foreach handlers

reply BenjiSmith <BenjiSmith_member pathlink.com> writes:
While we're talking about ideas for the "foreach" keyword, I'd like to chip in
something that concerns me a bit.

Foreach has its roots in perl (doesn't it?) where it only has to iterate over
arrays. And, while I'm a big fan of arrays, I'd prefer to use the best type of
data structure for a given situation. And if I'm going to use a foreach to
iterate over the elements in a custom templated class, an intrinsic foreach
won't be able to do the job. An intrinsic foreach iterator would have no idea
how to access the next element of a class, not to mention how to find it in the
most efficient way.

In particular, I'm thinking about a linked-list implementation that I just
finished writing. Let's say I want to iterate over all of the elements in my
list. How would an intrinsic foreach know how to find the elements of my list?
Even if it could somehow figure out how to get the ListNode elements out of the
LinkedList, it would probably be abysmally slow, since it would probably only be
able to use getElement(int) rather than getNextElement().

As the implementor of the LinkedList class, I could create a __foreach function
that would return the next element of the list, without having to hop through
all of the list links for each element.

So, what I'd like to see is something that looks like this:

***********************************************

instance TLinkedList(ListNode).LinkedList myList;

ListNode myLlistNode1 = newListNode();
ListNode myLlistNode2 = newListNode();
ListNode myLlistNode3 = newListNode();

myList.appendElement(myLlistNode1);
myList.appendElement(myLlistNode2);
myList.appendElement(myLlistNode3);

foreach (ListNode x from myList) {
doStuff(x);
}

***********************************************

To do so, I'd better have a foreach handler (an iterator, I guess) in my
LinkedList class that returns a ListNode object. If I haven't specified a
foreach handler that meets those requirements, the code shouldn't compile.

In the case of my LinkedList class, I would probably just make the foreach
handler pass on a call to getNextElement until it encountered a
LinkedListException.

Of course, dmd should have built-in foreeach handlers for instrinsic data
structures like static arrays, dynamic arrays, associative arrays, strings (for
iterating over the chars in the string).
Aug 01 2003
parent "Walter" <walter digitalmars.com> writes:
"BenjiSmith" <BenjiSmith_member pathlink.com> wrote in message
news:bge3dp$n5c$1 digitaldaemon.com...
 While we're talking about ideas for the "foreach" keyword, I'd like to

 something that concerns me a bit.

 Foreach has its roots in perl (doesn't it?) where it only has to iterate

 arrays. And, while I'm a big fan of arrays, I'd prefer to use the best

 data structure for a given situation. And if I'm going to use a foreach to
 iterate over the elements in a custom templated class, an intrinsic

 won't be able to do the job. An intrinsic foreach iterator would have no

 how to access the next element of a class, not to mention how to find it

 most efficient way.

 In particular, I'm thinking about a linked-list implementation that I just
 finished writing. Let's say I want to iterate over all of the elements in

 list. How would an intrinsic foreach know how to find the elements of my

 Even if it could somehow figure out how to get the ListNode elements out

 LinkedList, it would probably be abysmally slow, since it would probably

 able to use getElement(int) rather than getNextElement().

 As the implementor of the LinkedList class, I could create a __foreach

 that would return the next element of the list, without having to hop

 all of the list links for each element.

 So, what I'd like to see is something that looks like this:

 ***********************************************

 instance TLinkedList(ListNode).LinkedList myList;

 ListNode myLlistNode1 = newListNode();
 ListNode myLlistNode2 = newListNode();
 ListNode myLlistNode3 = newListNode();

 myList.appendElement(myLlistNode1);
 myList.appendElement(myLlistNode2);
 myList.appendElement(myLlistNode3);

 foreach (ListNode x from myList) {
 doStuff(x);
 }

 ***********************************************

 To do so, I'd better have a foreach handler (an iterator, I guess) in my
 LinkedList class that returns a ListNode object. If I haven't specified a
 foreach handler that meets those requirements, the code shouldn't compile.

 In the case of my LinkedList class, I would probably just make the foreach
 handler pass on a call to getNextElement until it encountered a
 LinkedListException.

 Of course, dmd should have built-in foreeach handlers for instrinsic data
 structures like static arrays, dynamic arrays, associative arrays, strings

 iterating over the chars in the string).

You're right. I have plans to do this, just haven't done it yet.
Aug 09 2003