Moritz Warning:

> > foreach(key; aa.keys)
> >    if(Test(key))
> >       aa.remove(key);
> 
> It's undefined behavior.
> You shouldn't try to mutate the aa while iterating.
> I hope that will be fixed.
> It took me some time to find this out.

In Python:

>>> d = {1:2, 3:4}
>>> for k in d: del d[k]
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

The "for k in d" sets a flag inside the d dict (AA), and del and insert 
operations test this flag, if it's true a runtime exception is thrown.

Something like this is enough in Python, but I think in D it's not safe enough 
and it may be a little slow too (because you have to test a flag every time). 
In D a compile-time test pass may be able to catch and warn against most of 
such situations (lint tools are able to do far more complex things).

--------------------

Christopher Wright

>Why not mandate using both keys and values?<

Iterating on tuples of an AA is probably a little slower than iterating on just 
keys.
On the other hand such AAs will have something like xkeys and xvalues methods 
too, that return light iterable objects (ranges, the first one has a O(1) 
opIn_r, while the opIn_r of the second is O(n)) that are enough to regain the 
lost performance when you need only keys or values, so this situation can 
become acceptable.

Bye,
bearophile

Reply via email to