Proposal: Object/?? Destruction

Q. Schroll qs.il.paperinik at gmail.com
Sun Oct 29 17:26:42 UTC 2017


On Monday, 16 October 2017 at 23:29:46 UTC, sarn wrote:
> On Sunday, 15 October 2017 at 15:19:21 UTC, Q. Schroll wrote:
>> 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.
>> ...
>>> You'd need to use a prefix or something to the bracket syntax.
>>> [snip]
>>
>> I just argued, you don't!
>
> But have you thought through all the implications?

Yes. No weirdness is being introduced that is not there already. 
Maybe I have overseen something; I will not give you or anyone 
else a guarantee for the solution to work perfectly. I've thought 
through the case very long.
An open question is allowing partly const/immutable/shared (cis) 
tuples. As for now, I didn't care. Even c/i/s-homogeneus tuples 
(the tuple is c/i/s as a whole or not) would be a win in my 
opinion. One rarely needs tuples with one component immutable but 
the other one mutable. This is what a named struct is for. On the 
other hand, I don't know of any issues having a to partly c/i/s 
std.typecons.Tuple.

> Take this code:
>
> void main(string[] args)
> {
>     import std.stdio : writeln;
>     writeln([1, 3.14]);
> }
>
> As you're probably 100% aware, this is totally valid D code 
> today.  [1, 3.14] becomes a double[] because 1 gets converted 
> to a double.

Right conclusion with insufficient explanation. [1, 3.14] is a 
static array in the first place. It occupies a fully inferred 
template parameter position. I don't know the implementation, but 
every time I tested, it behaves as if typeof(expr) is being used 
after the bang to set the template argument manually (even for 
Voldemort types etc. where typeof is sometimes impossible due to 
missing frame pointers). typeof returns "dynamic array of T" for 
array literals. This is all the weirdness going on here. It is 
present today and would remain present if you interpret [1, 3.14] 
as a tuple.

> If this kind of behaviour changes, code will break, so you'll 
> need a bunch of exceptions to the "it would be a tuple if 
> that's the best match" rule.

The only exception is typeof and (therefore, I don't know...) 
template inference.

> Also, for the same backwards compatibility reasons, it would be 
> impractical in most cases to add any tuple overloads to most 
> existing standard library functions that currently accept 
> slices or arrays, but presumably new functions would be meant 
> to take advantage of the new syntax (else there wouldn't be 
> much point creating a new syntax).

You don't have to as long as you don't want to support tuples 
explicitly; otherwise you have to. If you have a void f(int, 
double), you cannot plug in [1, 3.14]. You can use some expand to 
do it. You wouldn't want to either. If you have something 
*explicitly typed* as a tuple, e.g.
     [int, double] tup = [1, 3.14];
you can make the call f(tup) because auto expansion does its job. 
This is the use case. If you have void f([int, double]), you can 
plug in tuple literals.
If you use a tuple literal for a function call, the compiler will 
search for explicit matches for tuples. If it cannot find any, 
conversion to a dynamic array happens.

> So, a literal like [1, 3.14] would basically be a tuple, but 
> would be converted to double[] in a bunch of special cases for 
> historical reasons.

Yes. It would be converted in almost all cases -- the same with 
static arrays -- because the best match doesn't occur very often 
and typeof never returns static arrays or tuples for literals.

> If you're not sure if this is really a problem, take a look at 
> the confusion caused by the magic in {} syntax:
>
> https://forum.dlang.org/thread/ecwfiderxbfqzjcyymkg@forum.dlang.org
> https://forum.dlang.org/thread/ihsmxiplprxwlqkgwswc@forum.dlang.org
> https://forum.dlang.org/thread/qsayoktyffczskrnmgxu@forum.dlang.org

This is completely unrelated. Concerning the issues people have 
with (..) => { .. }, I've filed an enhancement request to 
deprecate it in that specific case: 
https://issues.dlang.org/show_bug.cgi?id=17951

> To be totally honest, I still don't see what's wrong with just 
> creating a new bracket syntax, instead of adding more magic to 
> [] (or () for that matter).

It's not adding any magic to [] that isn't there already. The 
other proposals are adding magic to (). Even some mathematicians 
use chevrons (angle brackets) for tuples as they see parentheses 
as indicators of precedence. I'd vote against angle brackets, see 
C++ templates for reasons. Logicians and haskellers even don't 
need parentheses for function calls.

Could I convince you?


More information about the Digitalmars-d mailing list