Algorithms & opApply

Steven Schveighoffer schveiguy at yahoo.com
Tue Aug 24 06:09:48 PDT 2010


On Tue, 24 Aug 2010 01:59:51 -0400, Fawzi Mohamed <fawzi at gmx.ch> wrote:

> On 24-ago-10, at 04:26, dsimcha wrote:
>
>> [...]
>> 3.  Ranges are the flagship way of iterating through an object in D, as  
>> they
>> should be.  opApply has its uses, but they're relatively few and far  
>> between.  I'm
>> wondering if anyone besides bearophile and I think supporting opApply  
>> is worth the
>> effort and potential bloat, if Walter cares enough to fix Bug 2443, and  
>> if Andrei
>> considers it to be a reasonable part of std.range/std.algorithm's  
>> design.
>
> I already defended opApply in the past let me put this here again:
>
> ranges abstract away one iteration step. This is useful because it means  
> that combining several of them, adancing in locksteo,... is possible and  
> easy to do
>
> opApply abstracts away a whole loop. This makes complex loops simpler to  
> realize without having to resort to fibers, and it allows *parallel*  
> looping in a natural way (which cannot be done directly using only  
> single iteration operations.
> In blip/dchem I use this quite a bit (for example for parallel loop  
> helpers, often my objects have obj.sLopp  
> obj.pLoop(blocksize=dafaultVal)).
> I like very much to be able to do foreach (x;obj.pLoop){...}
>
> Now they obviously are different kinds of abstractions, so looping in  
> lockstep is not possible with opApply, at most you can lockstep *one*  
> opApply with N iterators.
>
> About the operations in algorithm well I am not too sure how much  
> support there should be, if they require just looping then yes, but (for  
> example) I think that almost all of them would fail if feeded with a  
> parallel opApply.
> For sequential loops fibers can transform opApply in an iterator (just  
> as fibers can be used to easily make an iterator out of a complex loop).
> But fiber have a relatively high cost.
> So I suppose I would give support just to the basic stuff + conversion  
> for sequential loops (via fibers), keeping most of std.algorithm opApply  
> free


Building on this, (I once asked "do we need opApply anymore?"), I know of  
several reasons ranges do not replace opApply:

1. opApply is a more natural fit for virtual functions.
2. opApply can use the stack, ranges cannot.  This is useful for say  
iterating a binary tree without parent pointers.
3. opApply supports the full syntax of foreach, which can include multiple  
parameters in the loop.

I have proposed an enhancement in the past to make all callable symbols  
foreachable, including delegates, normal functions, and functors.  This  
would obviate the need for a special "opApply" function (just use opCall  
with the proper signature).

The bug is here: http://d.puremagic.com/issues/show_bug.cgi?id=2498

-Steve


More information about the Digitalmars-d mailing list