Any chance to call Tango as Extended Standard Library

Michel Fortin michel.fortin at michelf.com
Mon Jan 19 04:53:16 PST 2009


On 2009-01-18 22:00:17 -0500, Andrei Alexandrescu 
<SeeWebsiteForEmail at erdani.org> said:

> dsimcha wrote:
>> == Quote from Walter Bright (newshound1 at digitalmars.com)'s article
>>> dsimcha wrote:
>>>> One point of clarification:  opApply isn't going to be deprecated 
>>>> anytime soon, is
>>>> it?  It seems like ranges still have a bunch of rough edges, and 
>>>> although I like
>>>> the idea in principle, I'm only willing to convert to ranges if I can define
>>>> iterable objects with the same level of syntactic sugar as opApply 
>>>> gives me.  For
>>>> simple cases this is already true and I have begun converting some stuff.
>>>> However, for more complicated cases, opApply is still a lot more flexible.
>>> opApply isn't going away. For one thing, it works very well with
>>> recursive data structures.
>> 
>> So besides performance, what advantages does using ranges instead of 
>> opApply for
>> iteration over structs/classes offer?  According to some testing that I just
>> finished on the hash table implementation I was talking about earlier 
>> today, the
>> penalty for using opApply is small enough that, if using ranges 
>> requires a bunch
>> of extra bookkeeping overhead that opApply doesn't, then opApply can 
>> reasonably be
>> faster.
> 
> Speed is a small part of the equation, in fact a perk only. Ranges are 
> composable; you can combine them to e.g. do parallel iteration over two 
> ranges. Ranges really open std.algorithm to all data structures. I find 
> opApply incredibly obtuse and fostering bad design. I wish it goes away.
> 
> Andrei

But if it goes away, that'd prevent a lot of cool things that could be 
done with foreach. You could create a template that automatically 
distributes iterations to various threads with very little code 
(assuming the loop delegate is pure):

	foreach (i; paralelize(myArray))
		doSomethingComplicated();

All the complexity would lay in the opApply. You can't do this with ranges.

Other possible things involves a rudimentary profiler (checking for the 
elapsed time at each loop iteration), or a progress monitoring template 
(notifying another thread of the progress of a particular task).

	foreach (task; progessUpdater(timeProfiler(listOfTasks)))
	{ ... }

For basic data manipulation algorithms, ranges are better. But for more 
fancy stuff, opApply still rules.

-- 
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/




More information about the Digitalmars-d mailing list