Thread overview
opSlice Bug?
Nov 29, 2012
Namespace
Nov 29, 2012
Ali Çehreli
Nov 29, 2012
Namespace
Nov 29, 2012
Ali Çehreli
Nov 29, 2012
Namespace
Nov 29, 2012
bearophile
Nov 29, 2012
Ali Çehreli
Nov 29, 2012
Namespace
November 29, 2012
Why I have to write
arr2[] += arr[][]
instead of
arr2[] += arr[]
? Bug or 'feature'? :P

Code:
http://dpaste.dzfl.pl/4c732f4c
November 29, 2012
On 11/29/2012 08:15 AM, Namespace wrote:
> Why I have to write
> arr2[] += arr[][]
> instead of
> arr2[] += arr[]
> ? Bug or 'feature'? :P
>
> Code:
> http://dpaste.dzfl.pl/4c732f4c

opSplice, eh? Is that another undocumented feature or one that has been deprecated?

Ali
November 29, 2012
On Thursday, 29 November 2012 at 16:46:45 UTC, Ali Çehreli wrote:
> On 11/29/2012 08:15 AM, Namespace wrote:
>> Why I have to write
>> arr2[] += arr[][]
>> instead of
>> arr2[] += arr[]
>> ? Bug or 'feature'? :P
>>
>> Code:
>> http://dpaste.dzfl.pl/4c732f4c
>
> opSplice, eh? Is that another undocumented feature or one that has been deprecated?
>
> Ali

http://dlang.org/operatoroverloading.html#Slice
November 29, 2012
Ali Çehreli:

> opSplice, eh? Is that another undocumented feature or one that has been deprecated?

I think it's not deprecated:
http://dlang.org/operatoroverloading.html#Slice

Bye,
bearophile
November 29, 2012
On 11/29/2012 08:50 AM, Namespace wrote:
> On Thursday, 29 November 2012 at 16:46:45 UTC, Ali Çehreli wrote:
>> On 11/29/2012 08:15 AM, Namespace wrote:
>>> Why I have to write
>>> arr2[] += arr[][]
>>> instead of
>>> arr2[] += arr[]
>>> ? Bug or 'feature'? :P
>>>
>>> Code:
>>> http://dpaste.dzfl.pl/4c732f4c
>>
>> opSplice, eh? Is that another undocumented feature or one that has
>> been deprecated?
>>
>> Ali
>
> http://dlang.org/operatoroverloading.html#Slice

Thanks. I really did read it as opS_p_lice, found a few references on dlang.org, none on any spec page and got a little frustrated. I did not realize that I had clearly misread it.

I had even written some notes about opSlice:

  http://ddili.org/ders/d.en/operator_overloading.html

Apparently I had thought that it better returned a special type:

struct Range
{
    // ...
}

struct Container
{
    // For the object[] syntax
    Range opSlice()
    {
        Range allElements;
        // ... must provide access to all elements ...
        return allElements;
    }

/* ... */
}

Ali
November 29, 2012
Yes, that could be better (but I don't like it), but my code should compile as well, or not?
November 29, 2012
On 11/29/2012 08:15 AM, Namespace wrote:
> Why I have to write
> arr2[] += arr[][]
> instead of
> arr2[] += arr[]
> ? Bug or 'feature'? :P
>
> Code:
> http://dpaste.dzfl.pl/4c732f4c

Apparently, the array-wise operations require the following syntax:

    a[] += b[];

In other words, the compiler wants to see [] on the right-hand side as well. The following does not work with the same error message that you get:

    int[] a, b;
    a[] += b;

Error: invalid array operation a[] += b (did you forget a [] ?)

It is the same in your case. You have a function that returns a slice but the compiler still wants to see [] on the rigth-hand side:

int[] foo()
{
    int[] b;
    return b;
}

void main()
{
    int[] a;
    a[] += foo();    // <-- Same compilation error
}

That's why you need to put the [] after it:

    a[] += foo()[];

I think it is just the requirement of the syntax. (?)

Ali
November 29, 2012
That is what I thought also.
That is awfully and limited. :/