Tuples a first class feature, manu's new unary operator and named arguments
Mark
smarksc at gmail.com
Sun May 10 20:59:00 UTC 2020
On Sunday, 10 May 2020 at 17:56:22 UTC, Timon Gehr wrote:
> On 10.05.20 14:06, Mark wrote:
>> On Sunday, 10 May 2020 at 03:14:08 UTC, Timon Gehr wrote:
>>> On 09.05.20 19:07, Mark wrote:
>>>> but the syntax is extremely terse (*mytuple).
>>>
>>> def foo(x, y):
>>> return x + y
>>>
>>> print(map(foo, [(1, 2), (3, 4)])) # without unpacking, does
>>> not work
>>>
>>> # manual unpacking, kind of not "extremely terse":
>>> print(list(map(lambda t: foo(*t), [(1, 2), (3, 4)])))
>>
>> Hmmm, very good point.
>>
>> The issue seems similar (at least in spirit) to that of
>> implicit casting. Implicit casting is, in a sense, syntactic
>> sugar, saving you from writing "cast(mytype) myval" all over
>> the place. It's also a highly contentious issue; everyone
>> seems to be have their opinion of the extent to which implicit
>> casting is a good thing.
>
> It's not really similar. The problem is that there are two
> different things that are actually the same but still formally
> require conversion between each other. It's busywork without a
> justification.
They're not strictly the same. Consider the following function
calls:
foo(1, 2, 3)
foo((1, 2, 3))
foo((1, 2), 3)
foo(1, (2, 3))
foo((1), (2), (3))
etc.
Maybe you intend for tuples to automatically "flatten" in the
context of a function argument list (that is, all of the above
expressions would be equal to foo(1, 2, 3)). This is a valid
design decision but notably this is very different from how array
and struct literals work. If the signature of foo were
void foo(int[2], int[1]);
then foo([1,2],[3]) is accepted, but foo([1],[2, 3]) is rejected.
This is the kind of "implicit casting" I'm talking about.
More information about the Digitalmars-d
mailing list