RFC on range design for D2
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Tue Sep 9 14:42:16 PDT 2008
Benji Smith wrote:
> bearophile wrote:
>> 6) Built-in data types are important, they aren't meant to replace a
>> good standard library, where you can find more specialized and more
>> efficient data structures. The built-in data types are meant to:
>> - offer a very handy syntax, easy to use and remember, short to type too.
>> - They have to be efficient in a very wide variety of situations, so
>> they must avoid having really bad peformance in a large number of
>> situations, while it's okay for them to be not much fast in any
>> situation.
>> - They are useful for example when you have little data, in 90% of the
>> code where max performance isn't so important. In the other situations
>> you are supposed able to import things like an
>> IntrusiveRedBlackHashMap from the std lib.
>
> I'd also add this:
>
> A built-in data-type can't implement an interface, so there should be
> one and only one obvious implementation of its interface. For example,
> it would be a mistake to have a "File" as a built-in type, because a
> "File" really ought to implement an "InputStream" interface, so that
> people can write stream-consumer code generically.
>
> It's one of the reasons I think dynamic arrays and associate arrays
> belong in the standard library (as List and Map interfaces) rather than
> as built-in types.
>
> On a separate note...
>
> I'm also a little skeptical about the range proposal (though I'll have
> to give it more thought any maybe play with an implementation before I
> can come to any firm conclusion). The proposal seems to cover the
> standard cases, of bounded and unbounded forward iteration, reverse
> iteration, etc.
>
> But I can think of a few examples where the concept of "iteration" needs
> to be even more generalized.
>
> For example, I worked on a project last year (in Java) that used a
> hidden markov model to navigate through the nodes of a graph, driving a
> montel carlo simulation.
>
> I designed the MarkovModel<T> class to implement the Collection<T>
> interface so that I could use foreach iteration to crawl through the
> nodes of the graph. It basically looked like this:
>
> MarkovModel<SimulationState> model = ...;
>
> for (SimulationState state : model) {
> state.doStuff();
> }
>
> The cool thing about this is that the simulation would continue running
> until it reached a natural termination point (a simulation state with no
> outbound state transition probabilities).
>
> Depending upon the particulars of the model, it might never end. And
> although the ordering of the nodes was significant, it was never
> deterministic. Iterating through the states of a markov model is
> essentially a probabilistically guided random-walk through the elements
> of the collection.
>
> For me, java iterators made a very natural design choice, since the
> iterator is such a dirt-simple interface (with just a "hasNext" and
> "next" method).
>
> How would the D range proposal address the sorts of problems that
> require non-deterministic iteration? To me, the metaphor of a "range" is
> nice, but it doesn't cover all the cases I'd like to see in a
> general-purpose iteration metaphor.
Hmm, HMMs :o). If you could do it with Java's hasNext and next, you can
do it with D's isEmpty and next. There's no difference.
Andrei
More information about the Digitalmars-d-announce
mailing list