Siarhei,
Thanks for this possibility. I didn't know D had "pointers" like this.
Unfortunately, it appears that you can't pick up where you left off with
that pointer? You have to re-scan forward?
bachmeier,
I didn't reply to Steven's question; I replied to his claim that there
was no value. I found his response insulting and patronizing, and has
no place on a public forum helping evangelize D. See Siarhei's response
for a better way.
Siarhei,
I'm attempting to do something like a DFS down a fixed list of strings.
It's doing something like generating permutations of the strings, however
the conditions for the search are fairly complicated, and of course I'm
trying to do as much "early exit" as possible. That is, I can prune
branches just seeing the first or second word.
IOW, if D could, for example, "iterate through all 3 word combinations
in this list", it would be useless to this problem (or at least very
expensive.) OTOH, a forward iterator (i.e. copyable but does not need to
go backwards) solves the problem elegantly and efficiently.
Go-lang supports it too:
package main
import "fmt"
import "reflect"
func main() {
m := make(map[string]int)
m["key1"] = 7
m["key2"] = 8
iter := reflect.ValueOf(m).MapRange()
// Advance iterator
iter.Next()
// Preserve position
iter2 := *iter
// Exhaust first iterator
for iter.Next() {
fmt.Println("iter: ", iter.Key())
}
// What does second iterator see?
for iter2.Next() {
fmt.Println("iter2: ", iter2.Key())
}
}
will correctly print:
iter: key2
iter2: key2