Proposal: Object/?? Destruction

Q. Schroll qs.il.paperinik at gmail.com
Sun Oct 15 15:19:21 UTC 2017


On Saturday, 14 October 2017 at 23:20:26 UTC, sarn wrote:
> On Saturday, 14 October 2017 at 22:20:46 UTC, Q. Schroll wrote:
>> Therefore, and because of brackets, you can distinguish f(1, 
>> 2) from f([1, 2]).
>
> But in f([1, 2]), it's ambiguous (just by parsing) whether [1, 
> 2] is a tuple literal or a dynamic array literal.

It would be a tuple if that's the best match, otherwise 
conversion to int[] is tried. Even today, [1, 2] is ambiguous: Is 
it a static or a dynamic array of int? Is it of type int[2] or 
int[]? The spec says, it depends what you do with it! We can 
progress that and enlarge the int[2] version to [int, int] -- a 
special case of a 2-tuple. It remains the same: If [1, 2] can be 
used as a dynamic array, it will be. If not, the compiler tries a 
static array. With tuples, it would try a tuple. If f has an 
overload taking int[] or something similar, it will treat [1, 2] 
as a dynamic array with homogeneus types. If the objects are not 
compatible, an error occurs like "tuple [..contents..] cannot be 
implicitly converted to T[]". Else, if it has an overload for a 
compatible (length, implicit conversion) tuple, that will be 
taken. Consider
    void f(int[2] v) { } // (1)
    void f(int[ ] v) { } // (2)
Here, f([1, 2]) calls (1) as it is the better match. Yet with
    auto x = [1, 2];
f(x) calls (2) because of strict typing. So while [1, 2] is of 
type int[2] or [int, int] as a tuple, typeof([1, 2]) will still 
yield int[]. You cannot ask the one and only correct type of 
[]-literals as they have more than one type. Even if the values 
are incompatible like [1, "a"], asking typeof([1, "a"]) will 
result in an error, because in typeof deduction, []-literals must 
result in dynamic arrays. This holds for auto, because auto has 
the same rules.
    auto tup = [1, "a"];
must fail. You'd need
    [auto, auto] tup = [1, "a"];
or maybe some shorthand syntax that lowers to this.

> You'd need to use a prefix or something to the bracket syntax.
> [snip]

I just argued, you don't!

The reason there is no such prefix and not even a function in 
Phobos, is it is a trivial task to make one.
     T[n] s(T, size_t n)(T[n] elem ...) { return elem; }
     static assert(is(typeof(s(1, 2, 3)) == int[3]));
     static assert(is(typeof([1, 2, 3].s) == int[3]));
     auto x = s(1, 2, 3);
     static assert(is(typeof(x) == int[3]));
     auto x = s(1, 2.0, 3);
     static assert(is(typeof(x) == double[3]));
Try it yourself. It works fine. Instead of s one would use t or 
tuple to allow incompatible types.


More information about the Digitalmars-d mailing list