N-lang
N-lang copied to clipboard
Allow parentheses to be omitted around tuples where sensible
In Python, you don't need parentheses around tuples all the time. For example,
# Swaps variables
a, b = b, a
# Iterate over list with index
for i, item in enumerate(list_of_items_):
# Return a tuple
return None, False
Currently, N requires parentheses around tuple expressions/literals and types (but not patterns, I think). So, currently, the programmer has to write
let a, b: (char, float) = (\{π}, 3.14)
I feel like those parentheses around the value and type annotation aren't necessary, so instead, one can just write
let a, b: char, float = \{π}, 3.14
Parentheses will still be required inside type variables, lists, function arguments, and other tuples:
let wow: list[(char, float)] = [(\{e}, 2.72), (\{π}, 3.14)]
print((1, (2, 3)))
so I don't think allowing their omission should cause any problems.
(I'm adding the Python label because it's not in the Python implementation but it is in the JS implementation as of now; if this feature request gets rejected then I'll have to fix the JS impl.)
To implement this, I think we can first rename expression
to nontuple_expression
, and then replace the mentions of expression
in listval
, etc. with nontuple_expression
. Then, we can define expression
to be either a nontuple_expression
or a tupleval
. We can then remove parentheses from tupleval
. Because expression
can also be boolean_expression
, we probably should either require tupleval
to have at least two items (changing *
-> +
should do that) or in scope.py check how many items there are before creating a tuple.
tupleval: nontuple_expression ("," nontuple_expression)+ (",")?
?nontuple_expression: ifelse_expr
| boolean_expression
| function_def
| anonymous_func
| function_callback_pipe
| match
?expression: nontuple_expression
| tupleval
And something similar for tuple types (tupledef
).
We'd also have to relax the use of parentheses around tuples in the tests
Also, just to be safe, we should disallow a trailing comma unless it's inside parentheses
I think this is not that worth it for the number of edge cases it adds.
edge cases
Do you have any examples?
I still dislike this.