dropping elements of arrays and other simplistic views on foreach (rant,long)

Ary Manzana ary at esperanto.org.ar
Wed Nov 8 04:33:46 PST 2006


Karen Lanrap escribió:
> Those recent discussions about dropping elements of arrays and 
> 'linearizing' structures are more connected than the participants 
> of those discussions seem to believe.
> 
> A simple example:
> Binary trees can be implemented quite easily in arrays by defining 
> that the childs of a node located in cell i of the array are 
> located in the cells 2*i and 2*i+1. Under such a scheme the root of 
> the tree is located in cell 1 of the array.
> 
> As everyone should know, there are at least three canonical 
> traversals of binary trees: preorder, postorder and inorder.
> 
> How can those three traversals correspond to those two foreach: 
> "foreach" and "foreach_reverse"?
> 
> Right, there is no way. But those foreach correspond to tree 
> traversals.
> 
> If the cells of an array are viewed as a compressed representation 
> of a path in a tree from the root to a leaf, then "foreach" 
> corresponds to a preorder traversal and "foreach_reverse" 
> corresponds to a postorder traversal or, at the option of the 
> reader, to an inorder traversal, because both yield the same result 
> on pathes.
> 
> Combining this facts implies that only two "foreach" chracteristics 
> are not enough:
> 
> D needs at least
>     foreach(preorder),
>     foreach(inorder) and
>     foreach(postorder)
> where "foreach" is a short hand for "foreach(preorder)".
> 
> This generalization must be extended for trees with higher degree.
> 
> For trinary trees there are two positions to compute an inorder 
> traversal on the current node: after visiting the leftmost child or 
> before visiting the rightmost child.
> 
> In general: for an n-ary tree there are n+1 canonical traversals.
> 
> In other words: the current implementation of "foreach" has far too 
> few characteristics!

"foreach" shouldn't be the powerful one here: the iterator (or opApply) 
must be it.

It's just to write:

---
foreach(Element e; collection) {
}
---

instead of the longer and harder to understand

---
for(Iterator!(Element) it = collection.iterator(); it.hasNext(); ) {
	Element e = it.next();
}
---

Of course, "foreach" assumes member "iterator()" as default, but it 
should also be able (and it's posible in D) to do things like:

---
foreach(Element e; collection.preorder()) {
}

foreach(Element e; collection.postorder()) {
}

etc.
---

It's just give you a shorter, cleaner notation, that integrates well 
also with arrays. At least that's how it works in other languages.



More information about the Digitalmars-d mailing list