D - Custom foreach handlers
- BenjiSmith (40/40) Aug 01 2003 While we're talking about ideas for the "foreach" keyword, I'd like to c...
- Walter (16/56) Aug 09 2003 chip in
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
"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 tochip insomething that concerns me a bit. Foreach has its roots in perl (doesn't it?) where it only has to iterateoverarrays. And, while I'm a big fan of arrays, I'd prefer to use the besttype ofdata 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 intrinsicforeachwon't be able to do the job. An intrinsic foreach iterator would have noideahow to access the next element of a class, not to mention how to find itin themost 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 inmylist. How would an intrinsic foreach know how to find the elements of mylist?Even if it could somehow figure out how to get the ListNode elements outof theLinkedList, it would probably be abysmally slow, since it would probablyonly beable to use getElement(int) rather than getNextElement(). As the implementor of the LinkedList class, I could create a __foreachfunctionthat would return the next element of the list, without having to hopthroughall 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(foriterating over the chars in the string).You're right. I have plans to do this, just haven't done it yet.
Aug 09 2003