This discussion from Sum-tuples popped into my head over a more recent discussion with the problems of regular tuples, general syntax that uses parentheses, and single-element tuples.
The problem: tuples were overloaded for everything; all multi-element entities were supposed to be secretly implemented by tuples. That's why function parameter syntax was so chummy with tuples. Heck, ABI-level function passing explodes tuples, since tuples and function parameter packs weren't distinct. Now they are, but we still have the damage that a single-item tuple is a pain to use/interpret.
In the sum-tuple thread, anonymous sum tuples were expressed by a slightly different syntax for the standard tuples:
typealias RegularSumTuple = (| TypeWithOptionalLablel1, TypeWithOptionalLabel2, ... |)
typealias TypeCollaspedSumTuple = (< Type1, Type2, ... >)
typealias UncheckedSumTuple = @unsafe(< Type1, Type2, ... >)
Now I'm wondering if we should add a fourth special parentheses group, for product-tuples (i.e. regular tuples):
typealias Void = (* *)
typealias SingleElementTuple = (* TypeWithOptionalLabel *)
typealias MultipleElementTuple = (* TypeWithOptionalLabel1, TypeWithOptionalLabel2, ... *)
This gives an unambiguous syntax for product tuples distinct from expression-grouping or function parameter parentheses. It also gives an unambiguous syntax for single-element product tuples.
But "(* *)
" remind me of Pascal comments. Maybe "(& &)
"?