On 12/1/17 4:29 AM, Johan Engelen wrote:
On Friday, 1 December 2017 at 09:11:40 UTC, Johan Engelen wrote:

I tested it and it works like you wrote, but the behavior is different for an array of integers...:

Hmm, I guess I misread what Ali meant. But the documentation is wrong/very confusing for moveFront: It says "moveFront -- Removes the front element of a range." and "Moves the front of r out and returns it."  With "to move _out_", I would expect that the range is advanced/shortened/..., but it is not.

move is supposed to move the bits from one place to another (i.e. without calling any constructor or postblit). It doesn't destroy the existence of the original, it's supposed to leave it as an empty shell (read: set the original to it's .init value).

However, I'm surprised the front element is still 1. I would think it should be int.init. But I guess it makes sense that if a type doesn't have a destructor, there's no need to worry about initializing it. move probably doesn't care if it's a value type without a destructor.

(Also, I would expect "popFront" to return the element popped, but it doesn't, OK...

pop removes the front element, but if getting the front element is expensive (say if it's a map with a complex lambda function), you don't want to execute that just so you can return it to someone who doesn't care. This is why front and popFront are separate.

So which function name is given to the behavior of "pop" of other languages?)

Nothing. You have to do both front and popFront. Others have proposed a wrapper that does both, but in order to truly take advantage of the fact that you are removing and calculating the front value at the same time, you need a new range type. Some have suggested that too.

-Steve

Reply via email to