std.array.put doesn't put

Robert Jacques sandford at jhu.edu
Mon Mar 1 18:57:23 PST 2010


On Mon, 01 Mar 2010 16:51:41 -0500, Lars T. Kyllingstad  
<public at kyllingen.nospamnet> wrote:
> Paul D. Anderson wrote:
>> I've entered this as a Phobos bug, but wanted to be sure I was  
>> understanding this properly (i.e., this is a bug, right?):
>>  From the description of the put primitive in std.range:
>>  "r.put(e) puts e in the range (in a range-dependent manner) and  
>> advances to the popFront position in the range. Successive calls to  
>> r.put add elements to the range. put may throw to signal failure."
>>  From the example of std.array for the put function:
>>  void main()
>> {
>>     int[] a = [ 1, 2, 3 ];
>>     int[] b = a;
>>     a.put(5);
>>     assert(a == [ 2, 3 ]);
>>     assert(b == [ 5, 2, 3 ]);
>> }
>>  So, "putting" 5 into the array a removes the first element in a, and  
>> changes the value of the first element of b. I would expect the first  
>> assert in the code above to read:
>>      assert(a == [ 5, 1, 2, 3 ]);
>>  The implementation of std.array.put doesn't make sense:  void put(T,  
>> E)(ref T[] a, E e) { assert(a.length); a[0] = e; a = a[1 .. $]; }
>>  It modifies a[0] and then replaces the array with the tail of the  
>> array,
>> omitting the first element.
>>  It's possible there is some arcane meaning to the word "put" that I'm  
>> not aware of, but if it means "insert an element at the front of the  
>> range" then std.array.put is wrongly implemented.
>>  Paul
>
> I don't think it's a bug, I think it's just that arrays aren't that  
> useful as output ranges.  It has to be defined that way for it to adhere  
> to the range interface conventions.  (Think of the array as a file  
> instead, then it makes more sense.)  You just have to keep a backup  
> slice of the entire array so you can access the elements you have put()  
> later:
>
>    int[] a = [0, 0, 0, 0, 0, 0];
>    int[] aSlice = a[];
>
>    foreach (i; 0 .. a.length)  aSlice.put(i);
>
>    assert (a == [0, 1, 2, 3, 4, 5]);
>
> -Lars

Yes, it's not a bug. If you think of a common usage of arrays (buffers)  
this makes perfect sense. And if you want the other behavior you're  
supposed to use the appender wrapper.



More information about the Digitalmars-d mailing list