The documentation for std.range states

http://dlang.org/phobos/std_range.html
"This module defines the notion of range (by the membership tests isInputRange, isForwardRange, isBidirectionalRange, isRandomAccessRange), range capability tests (such as hasLength or hasSlicing), and a few useful range incarnations."

But that intro doesn't describe what a range actually is.

Here's what I've made out so far:

- Ranges are basically a generalised API for accessing a container or stream that is linear in logical structure and can have any element type.

- What is a range and what isn't is determined by compile-time duck typing - testing whether it implements certain methods.

- A range over a finite data structure is essentially equivalent to a start/end iterator pair as used by various C++ STL functions.

- Where a function in std.range is described as iterating through ranges in a particular way, what this function does is to return a range that delivers the resulting sequence.

Have I got all this right?


Things I'm confused by:

- One of the expansions of put is
    r.front = e; r.popFront();

What has putting something at the front of a range and then popping it to do with outputting to the range?

- Why is a range that can save checkpoints called a "forward" range?


Stewart.

Reply via email to