Why can’t this be done with a sigil, which also has precedence for 
shorthands like this. Elixir even states that it is build to be extendable 
without the need for syntax changes. Personal I dislike prior art 
justifications for shorthands and syntax changes like this, as it can 
potentially block or limit syntax changes in the future for new data 
structures. I think we would all be better off with a sigil, that way we 
also don’t limit ourselves to atom keys.

On Sunday, December 21, 2025 at 5:07:33 PM UTC-5 [email protected] wrote:

> I wish for this often.
>
> I would happily settle for this just to have it, although I don’t like the 
> syntax and also prefer the %{a, b} syntax like other languages (JS/TS, 
> Rust, ...)
>
> On Sunday, December 21, 2025 at 2:12:13 AM UTC-4 [email protected] 
> wrote:
>
>> I'm in support of this 👌
>>
>> It's a reasonable trade off from other concerns and as someone who works 
>> with people moving from other languages to Elixir often, they are 
>> *constantly* looking for this syntax. Given that this exact syntax is used 
>> in other languages also adds some regularity to it, despite my personal 
>> preference for js style %{a, b}. The "accidentally being a tuple" issue 
>> with that syntax goes away for 99% of cases conveniently with the type 
>> system FWIW :)
>>
>>
>> On Sun, Dec 21, 2025 at 10:58 AM, Danila Poyarkov <[email protected]> 
>> wrote: 
>>
>>> Hi everyone,
>>>
>>> José Valim suggested I move the discussion here from my PR: 
>>> https://github.com/elixir-lang/elixir/pull/15023
>>>
>>> I've implemented shorthand syntax for atom-keyed maps and keywords:
>>>
>>> ```elixir
>>> %{user:, conn:}  # => %{user: user, conn: conn}
>>> [foo:, bar:]     # => [foo: foo, bar: bar]
>>> f(name:, age:)   # => f(name: name, age: age)
>>> %{map | a:, b:}  # => %{map | a: a, b: b}
>>> ```
>>>
>>> I know this topic has been discussed many times before:
>>>
>>> - Proposal: Short Hand Property Names (2017): 
>>> https://groups.google.com/g/elixir-lang-core/c/XxnrGgZsyVc
>>> - Consider supporting a map shorthand syntax (2018): 
>>> https://groups.google.com/g/elixir-lang-core/c/NoUo2gqQR3I
>>> - ES6-ish property value shorthands for maps? (2016): 
>>> https://elixirforum.com/t/es6-ish-property-value-shorthands-for-maps/1524
>>> - Has Map shorthand syntax caused you any problems? (2018): 
>>> https://elixirforum.com/t/has-map-shorthand-syntax-in-other-languages-caused-you-any-problems/15403
>>>
>>> Most of these discussed the ES6-style `%{a, b}` syntax, which José made 
>>> clear had "zero chance" of being accepted — mainly because `%{a, b}` vs 
>>> `{a, b}` differs by one character, making maps and tuples too easy to 
>>> confuse.
>>>
>>> The colon-based syntax `%{a:, b:}` is different. The `:` that signals 
>>> "this is a key-value pair" stays there. There's no visual confusion with 
>>> tuples because `{a:, b:}` is not valid Elixir syntax anyway.
>>>
>>> José mentioned in the PR that he actually prefers this approach over 
>>> bare variables, but it was "deemed not acceptable by most people" in a 
>>> previous discussion. I'd like to understand what the objections were.
>>>
>>> Reading through the old threads, I found these concerns:
>>>
>>> - "Removing explicitness for the sake of brevity doesn't appeal to me." 
>>> (Chris Keathley)
>>> - "Shorthand syntax makes that coupling even less obvious" — if you 
>>> change a key, you need to find all functions that relied on that variable 
>>> name. (Chris Keathley)
>>> - "This will just add complexity to the language to save a few 
>>> keystrokes for advanced users." (Matt Widmann)
>>>
>>> These discussions happened in 2016-2018. Since then, Ruby 3.1 shipped 
>>> this exact syntax in December 2021 — almost 4 years ago. The syntax is 
>>> `{x:, y:}` for hashes and `foo(x:, y:)` for keyword arguments, exactly what 
>>> I'm proposing for Elixir.
>>>
>>> The Ruby reception was mixed at first — Bozhidar Batsov (RuboCop 
>>> maintainer) was critical (
>>> https://batsov.com/articles/2022/01/20/bad-ruby-hash-value-omission/) 
>>> but still allowed it in RuboCop defaults. Four years later, the syntax is 
>>> widely used.
>>>
>>> The same pattern (sometimes called "field punning") also exists in Rust 
>>> and OCaml.
>>>
>>> `%{user: user, conn: conn}` is already common in Elixir — this just 
>>> removes the repetition. The colon stays visible, so it's not as "magic" as 
>>> the bare variable approach. And Ruby has been using it for 4 years now 
>>> without issues.
>>>
>>> The implementation is ready and all tests pass. I'm curious whether 
>>> opinions have changed since 2018.
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "elixir-lang-core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to [email protected].
>>> To view this discussion visit 
>>> https://groups.google.com/d/msgid/elixir-lang-core/995a7fec-5992-484a-88c2-5aae3844f60fn%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/elixir-lang-core/995a7fec-5992-484a-88c2-5aae3844f60fn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/elixir-lang-core/7061e91f-b05c-40d3-8b46-5744e1a8f399n%40googlegroups.com.

Reply via email to