On May 7, 2009, at 5:03 AM, Dag Sverre Seljebotn wrote: > Robert Bradshaw wrote: >> With very few exceptions (the new division semantics being one of >> them), I think it's valuable that code manipulating all C types >> translates nearly directly to C with very little extra magic or >> layers. One is then free to write as nice or raw of an interface on >> top of that as one wishes. I think applying the same principles to C+ >> + is a good idea. > > OK. Variable scoping is still a problem. I'll just dump my current, > much > clearer thoughts for the record. > > 1) The "with" clause has C variable scope semantics but would be > kind of > a pain to use. > > with vector[int].iterator(vec.begin()) as it: # cdefs the "it" in > block > while it != vec.end(): > ... > > 2) Explicit construct/destruct is a possibility: > > cdef vector[int].iterator it > ... > construct(it, vec.begin()) > > destruct(it) > ... > > But, ugly. If you construct twice in a function or forget to destruct > you get to keep the pieces (often nothing bad will happen though). > > 3) Just tracking the first assignment, and destruct at end of > function, > would kind of work, but there's a problem: Basically the first > assignment must invoke placement new, while subsequent assignments > must > use "=". > > This could be dealt with with a seperate flag though! So you have a > flag > "is_constructed", and if it is not, use placement new for assignment, > otherwise use "=". > > As for eliminating such a flag, it would be easy to support > > cdef iterator it > it = vec1.begin() # placement new > if not foo: > it = vec2.begin() # "=" > > but much more difficult to support > > if foo: > it = vec1.begin() # placement new > else: > it = vec2.begin() # placement new > > and impossible to do > > if foo: > it = vec1.begin() > it = vec2.begin() # placement new or "="? need a flag > > Still, using such a flag in all situations before we have control flow > analysis is a lot better than refcounting until we have control flow > analysis :-) > > Finally, we could still have an explicit > > destruct(it) > > which would also toggle the flag back, making the next assignment > reconstruct the object. > > This would actually work :-) (assuming void*[] is all the alignment we > need).
I much prefer option (3), that seems both feasible and obvious to use. - Robert _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
