www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - pure delegates and opApply

I have some use cases where I am trying to iterate over a 
collection in a pure function. The collection doesn't change, but 
the foreach loop body updates a variable elsewhere in the 
function body. (I'm reimplementing reduce as pure nothrow, and 
the variable in question is the accumulator).

Since opApply is implemented as a delegate, though, this prevents 
my function from being pure. The delegate isn't pure because it 
writes through its context pointer - but the context pointer 
shouldn't capture anything outside of the calling function's 
scope  (I have no idea how to verify this).

In other words, if I replaced the foreach with a for-loop, my 
function would be pure.

I see 3 possible takes on this, please tell me if I'm hot or cold:

1) foreach is the idiomatic D way to iterate, but since I am 
insisting on purity, I have to accept that I might have to do 
things in a non-idiomatic way and go for the for-loop.

2) ranges are the other idiomatic D way to iterate, and if I want 
purity then I should be working with ranges anyway (as they have 
a more mathematical flavor to them than foreach or for)

3) opApply ought to be considered pure if the supplied delegate 
doesn't modify anything outside of the calling function's scope 
(bug/enhancement)
Jul 29 2014