bartblast
Keyword inside tuple shorthand syntax {a: 1, b: 2}
This could resolve to {[a: 1, b: 2]}. Was it ever considered to allow such syntax? Notice this: {:abc, a: 1, b: 2} and this: my_fun(:abc, a: 1, b: 2) work as I described. As I understand, the compiler is able to figure out that the second part is a keyword list.
I can see that it is similar to %{a: 1, b: 2}, and it may be misleading for people coming from Ruby (hash syntax).
Context: I’m working on Hologram’s template engine. If the shorthand syntax worked for tuples as well, it would simplify a few things since Hologram uses tuples for interpolation and prop syntax, e.g.
<MyComponent my_prop={:my_value} />
or
<button $click={:do_something, a: 1, b: 2}>Click me</button>
or shorthand class attribute syntax:
<div class={button: true, "button-active": false}></div>
This issue can be handled by the template parser, but I feel that it may be beneficial to support it in the Elixir compiler.
Most Liked
al2o3cr
My supported-only-by-vibes take is that when a user writes {a: 1, b: 2} they are far more likely to be typoing either a map literal (missing %) or a kwlist literal (wrong kind of bracket). ![]()
LostKobrakai
Looking at Syntax reference — Elixir v1.16.3 I’m wondering if the syntax sugar in tuples should rather be removed. The atom shorthand within […] and %{…} works the same, but is considered a feature available for both those types and is not available for tuples.
The syntax sugar for skipping square brackets is documented to apply for the last parameter of calls. Creating a tuple is not a call. The closest comparison to the creation of a tuple would be the creation of a binary <<…>>.
Eiji
@gregvaughn Yes, it’s indeed confusing - the syntax, see:
iex> {:do_something, a: 1, b: 2}
{:do_something, [a: 1, b: 2]}
iex> {a: 1, b: 2}
** (SyntaxError) invalid syntax found on iex:2:1:
error: unexpected keyword list inside tuple. Did you mean to write a map (using %{...}) or a list (using [...]) instead? Syntax error after: '{'
│
2 │ {a: 1, b: 2}
│ ^
│
└─ iex:2:1
(iex 1.17.0-rc.1) lib/iex/evaluator.ex:295: IEx.Evaluator.parse_eval_inspect/4
(iex 1.17.0-rc.1) lib/iex/evaluator.ex:187: IEx.Evaluator.loop/1
(iex 1.17.0-rc.1) lib/iex/evaluator.ex:32: IEx.Evaluator.init/5
(stdlib 6.0) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
How about something like this?
<div {:class, button: true, "button-active": false}></div>
Eiji
It’s more rather about consistency. As mentioned this is supported in other cases, so I think same i.e. it should be supported in tuples.
sodapopcan
I can get on board with the consistency argument but I think the desire for this would be realllllly niche. I’ve had the exact thought as @bartblast were I was thinking it would be nice shorthand for this to work in HEEx, but that is literally the only time. I think it’s more beneficial not introduce the ambiguity of %{a: :b} vs {a: :b} for a niche purpose.







