A Discussion of Tuple Syntax
Meta
jared771 at gmail.com
Tue Aug 20 07:22:23 PDT 2013
On Tuesday, 20 August 2013 at 13:57:49 UTC, Dicebot wrote:
> Syntax sugar will only hide and eventually increase confusion,
> it won't solve the semantical issue. This is why we are having
> this topic IMHO, bunch of quite experienced D developers can't
> even agree on how existing feature behaves :) Including those
> who is it all the time! It is clear indicator that syntax is
> not the one to blame.
My suggestions are predicated on the fact that I think tuples are
more or less fine as-is. They just need some syntactic sugar for
literals and destructuring/pattern matching to make them more
usable. Built-in tuples are confusing, I think, because they're
named TypeTuple, which makes people conflate them with
std.typecons.Tuple.
Another reason is that TypeTuple can contain both values and
types at the same time, so it's confusing as to what you can do
with them.
"Why can you only assign a TypeTuple to a variable if it contains
values but not types? Why, then, can't you return TypeTuple!(1,
2.3) from a function? Is it not really a variable? Why does
`alias t = TypeTuple!(1, 2.3)` work, but `alias n = 3` not work?
Is this f*$#ing thing a value or a type?" - D Newbie
Everything else aside, I think the best possible change that
would make the whole tuple situation better is to limit or
outright ban the mixing of values and types within TypeTuple.
Even better is to always treat TypeTuple as a type, and not a
value. That ship has already sailed, but we can at least try to
enforce it through convention.
> I am proposing something more radical. Deprecate _both_
> TypeTuple and Tuple. Clearly define the difference between
> built-in type tuple and expression tuple (latter being instance
> of former). Preserve auto-expansion. Provide two different
> literals to remove ambiguity between referencing symbol as a
> value and referencing it as an alias. Make compiler
> auto-generate Tuple-like struct type for expression tuples that
> need to be returned from functions. Create some new type in
> std.typecons for those who don't want auto-expansion.
>
> It won't even break stuff.
I think my position has changed to suggest nearly the same thing.
There needs to be a clear separation between built-in tuples and
tuple values. A runtime tuple literal syntax helps with that.
Making typeof(tuple(1, 2.3)) == TypeTuple!(int, double) helps as
well, because it is now clear that one is a value and one is a
type. Limiting the mixing of values and types within TypeTuple
helps with that.
This would allow both Tuple and TypeTuple to be deprecated. Tuple
wouldn't be needed anymore, because we would have a literal
syntax to replace it. It would only be there for backwards
compatibility. With Tuple deprecated, std.typetuple.TypeTuple
could be renamed Tuple, and we would then have only one thing
with the name Tuple in the language.
More information about the Digitalmars-d
mailing list