> Just throwing it out there that this notation would make for a very nice MapSet literal. :)
:D I am deeply convinced that this is why python, in its walrus operator attempt <https://docs.python.org/3/whatsnew/3.8.html#assignment-expressions> to keep up with Ruby features, has not offered a response to Ruby's Hash assignment destructuring of {foo:, bar:}: the {} literal syntax in python is already overloaded for both its native associative array literal construct (dicts) and set literal construct (sets), which share {} as delimiters and cause endless confusion already. On Thursday, June 29, 2023 at 3:14:51 AM UTC-5 woj...@wojtekmach.pl wrote: > > %{foo, bar} > > Just throwing it out there that this notation would make for a very nice > MapSet literal. :) > > On 29 Jun 2023, at 10:05, Christopher Keele <christ...@gmail.com> wrote: > > > There is another idea here, which is to fix this at the tooling level. > > > > For example, we could write %{foo, bar} and have the formatter > automatically expand it to: %{foo: foo, bar: bar}. > > I do like this notion, but am worried about fragmentation at the tooling > level. > > I see a syntax addition (even if an ephemeral operator, deprecated with > atom garbage collection) as an elegant way to traverse this. If we lean > into the syntax addition of this proposal, Paul does make a valid point: > > > Make the case why *extra* syntax is better than the more limited > barewords-only implementation, for example, by enabling support for string > keys, by offering a syntax construct that can be used in more places, etc. > > Hence the proposal. However, I think a constructive outcome of this > discussion could be proposing exactly that expansion to tooling > maintainers. :) > > On Thursday, June 29, 2023 at 2:59:39 AM UTC-5 Christopher Keele wrote: > >> > Another idea is to improve Elixir LS itself to suggest the variable >> name itself after ":". So if I type "%{foo:", it immediately suggests " >> foo". So, once again, easy to write, easy to read. >> >> I think this is part of the popularity of the opinion that some such >> syntax should only work for structs: with Elixir LS today, starting to type >> a `key:` in a struct/map literal does indeed suggest from the list of known >> struct keys. I don't see this being impossible in LS tooling today, but >> also don't know much about what is possible with the language server >> protocol today. :) >> On Thursday, June 29, 2023 at 2:54:28 AM UTC-5 José Valim wrote: >> >>> There is another idea here, which is to fix this at the tooling level. >>> >>> For example, we could write %{foo, bar} and have the formatter >>> automatically expand it to: %{foo: foo, bar: bar}. So you get the concise >>> syntax when writing, the clear syntax when reading. Since most editors >>> format on save nowadays, it can be beneficial. Executing code with the >>> shortcut syntax will print a warning saying you must format the source file >>> before. >>> >>> Another idea is to improve Elixir LS itself to suggest the variable name >>> itself after ":". So if I type "%{foo:", it immediately suggests " foo". >>> So, once again, easy to write, easy to read. >>> >>> On Thu, Jun 29, 2023 at 9:49 AM Christopher Keele <christ...@gmail.com> >>> wrote: >>> >>>> > As a counter point: Ruby has added this feature as {foo:, bar:}, >>>> which would have a direct translation to Elixir. Source: >>>> https://bugs.ruby-lang.org/issues/14579 >>>> >>>> As a Rubyist who came to Elixir in the early days for personal projects >>>> before that Ruby syntax was implemented, and has only been professionally >>>> an engineering team manager of python, JS, and TS applications since: I >>>> like the explicitness of Ruby's notation here, but still really hate it >>>> how >>>> it reads and syntax highlights. :`) >>>> >>>> That is just a personal opinion though, out of context of the utility >>>> of this proposal. However, I believe that incarnation for Elixir has been >>>> proposed before, and I am just searching for alternatives that would still >>>> enable field punning sooner rather than later. >>>> >>>> > You are doing great. You defend your proposal and ideas. :) >>>> >>>> Thank you! It is not easy to defend a language syntax proposal I do not >>>> personally adore the syntax of; but I imagine that's what many people felt >>>> like for Ruby's equivalent, with {foo:, bar:} (as I did at the time). >>>> I earnestly believe that this idea could mitigate pain points with Elixir >>>> adoption while reasonably contending with ES6 barewords syntax we are not >>>> yet able to adopt. However, I would not be heartbroken if we agreed that >>>> waiting for Elixir 2.0 and/or atom garbage collection was the right play >>>> here. >>>> >>>> On Thursday, June 29, 2023 at 2:33:22 AM UTC-5 José Valim wrote: >>>> >>>>> > I would argue that if we want to support only atoms, but make it >>>>> clear that the syntax only applies to atoms, before an Elixir 2.0, we >>>>> must >>>>> leverage atom literals in the feature. The addition of a new operator >>>>> (or, >>>>> overloading of the capture operator in previous incarnations of this >>>>> proposal) is the only way to accomplish this today. >>>>> >>>>> As a counter point: Ruby has added this feature as {foo:, bar:}, which >>>>> would have a direct translation to Elixir. Source: >>>>> https://bugs.ruby-lang.org/issues/14579 >>>>> >>>>> > Apologies if it feels like I am trying to torpedo other solutions, >>>>> that is not my intent at all. >>>>> >>>>> You are doing great. You defend your proposal and ideas. :) >>>>> >>>>> On Thu, Jun 29, 2023 at 9:29 AM Christopher Keele <christ...@gmail.com> >>>>> wrote: >>>>> >>>>>> Honestly, I do not adore the syntax of the proposed solution, in >>>>>> either capture or $ operator incarnation. I would also prefer >>>>>> barewords. >>>>>> >>>>>> *Re: Paul's note:* >>>>>> >>>>>> > It is not at all clear to me why supporting string keys is >>>>>> critical to the feature >>>>>> >>>>>> 100%, Phoenix params parsing support. This is the major obvious >>>>>> use-case for full-stack devs today of this proposal. If garbage >>>>>> collection >>>>>> of atoms is implemented in erlang, we could deprecate the proposed >>>>>> syntax >>>>>> readily. >>>>>> >>>>>> Most of my personal Elixir development does not use Phoenix, so I do >>>>>> empathize with the sentiment and prefer atoms/barewords, but have tried >>>>>> to >>>>>> accommodate the outcry for this feature in this proposal, contending >>>>>> with >>>>>> popularity of JS's barewords implementation, concerning fullstack >>>>>> Phoenix >>>>>> development on >>>>>> >>>>>> > the Elixir forum (1 >>>>>> <https://elixirforum.com/t/proposal-add-field-puns-map-shorthand-to-elixir/15452> >>>>>> , 2 >>>>>> <https://elixirforum.com/t/shorthand-for-passing-variables-by-name/30583> >>>>>> , 3 >>>>>> <https://elixirforum.com/t/if-you-could-change-one-thing-in-elixir-language-what-you-would-change/19902/17> >>>>>> , 4 >>>>>> <https://elixirforum.com/t/has-map-shorthand-syntax-in-other-languages-caused-you-any-problems/15403> >>>>>> , 5 >>>>>> <https://elixirforum.com/t/es6-ish-property-value-shorthands-for-maps/1524> >>>>>> , 6 >>>>>> <https://elixirforum.com/t/struct-creation-pattern-matching-short-hand/7544> >>>>>> ) >>>>>> >>>>>> *Re: José's note:* >>>>>> >>>>>> > I agree with Paul that we don't need to support both strings and >>>>>> atoms, but it must be clear that it applies to either strings or atoms. >>>>>> >>>>>> I would also prefer only supporting atoms, or even as a compromise >>>>>> with string confusion, only structs. Previous proposals have flighted >>>>>> this >>>>>> before, and have not succeeded. >>>>>> >>>>>> I would argue that if we want to support only atoms, but make it >>>>>> clear that the syntax only applies to atoms, before an Elixir 2.0, we >>>>>> must >>>>>> leverage atom literals in the feature. The addition of a new operator >>>>>> (or, >>>>>> overloading of the capture operator in previous incarnations of this >>>>>> proposal) is the only way to accomplish this today. >>>>>> >>>>>> If we really wanted to drive this home, we could only support atom >>>>>> literals in the proposal, and drop the support for strings; however, I >>>>>> don't see a way to resolve this tension today without employing atom >>>>>> literals in the feature's syntax. >>>>>> >>>>>> *Re: Paul's note:* >>>>>> >>>>>> > I really don't want this thread to devolve into argument like many >>>>>> of the others on this topic, but making statements like "a barewords >>>>>> implementation is not viable in Elixir" is not doing any favors. It is >>>>>> factually untrue, and the premise of the statement is based entirely on >>>>>> an >>>>>> opinion. If this thread is going to have any hope of making progress, >>>>>> broad >>>>>> assertions of that nature better be backed up with a lot of objective >>>>>> data. >>>>>> >>>>>> I wish there were a data-driven way to approach language design. The >>>>>> only tool I know of is flighting proposals with working prototypes. >>>>>> >>>>>> > Make the case why *extra* syntax is better than the more limited >>>>>> barewords-only implementation, for example, by enabling support for >>>>>> string >>>>>> keys, by offering a syntax construct that can be used in more places, >>>>>> etc. >>>>>> It isn't necessary for your proposal to torpedo other solutions in order >>>>>> to >>>>>> succeed, and has a better chance of doing so if you don't. >>>>>> >>>>>> This proposal makes a case for this syntax being better than a more >>>>>> limited barewords-only implementation. Specifically, it enables support >>>>>> for >>>>>> string keys, and offers a syntax construct that can be used in more >>>>>> places >>>>>> (as a specific example, error = "rate limit exceeded"; $:error # >>>>>> return error tuple. Apologies if it feels like I am trying to >>>>>> torpedo other solutions, that is not my intent at all. >>>>>> On Thursday, June 29, 2023 at 2:02:04 AM UTC-5 José Valim wrote: >>>>>> >>>>>>> Hi Chris Keele, thank you for the excellent proposal. I just want to >>>>>>> add that I agree with Paul that we don't need to support both strings >>>>>>> and >>>>>>> atoms, but it must be clear that it applies to either strings or atoms >>>>>>> (if >>>>>>> it supports only one of them) and the reason for that is because >>>>>>> otherwise >>>>>>> it will add to the string vs atom confusion that already exists in the >>>>>>> language. Someone would easily write def show(conn, %{id}) and be >>>>>>> surprised >>>>>>> why it doesn't match. >>>>>>> >>>>>>> A couple additional thoughts to the thread: >>>>>>> >>>>>>> * : in JS and = in Haskell/OCaml are operators. : in Elixir is not >>>>>>> an operator >>>>>>> >>>>>>> * &:foo/$:foo as a shortcut for {:foo, foo} is interesting but note >>>>>>> that "foo: foo" already work as a shortcut in select places - so we >>>>>>> would >>>>>>> introduce more ways of doing something similar >>>>>>> >>>>>>> * Elixir and Ruby shares a lot syntax wise, it may be worth >>>>>>> revisiting what they do and which points arose in their >>>>>>> discussions/implementations >>>>>>> >>>>>>> On Thu, Jun 29, 2023 at 8:51 AM Paul Schoenfelder < >>>>>>> paulscho...@fastmail.com> wrote: >>>>>>> >>>>>>>> For reasons explained in Austin's reply >>>>>>>> <https://groups.google.com/g/elixir-lang-core/c/P6VprVlRd6k/m/ijxO7HdpAgAJ>, >>>>>>>> >>>>>>>> a "barewords" implementation is not viable in Elixir, because of the >>>>>>>> prevalence of both atom and string key types. >>>>>>>> >>>>>>>> IMO, discussing the nuance of if a barewords representation should >>>>>>>> prefer atoms or keys is what has been continually holding this feature >>>>>>>> up >>>>>>>> for a decade, and that's what this proposal tries to move past. >>>>>>>> >>>>>>>> >>>>>>>> I don't agree that the rationale given by Austin is sufficient to >>>>>>>> reject a barewords-only implementation of field punning in Elixir. It >>>>>>>> is >>>>>>>> not at all clear to me why supporting string keys is critical to the >>>>>>>> feature, and I especially don't find the argument that people will >>>>>>>> ignore >>>>>>>> all of the plentiful advice about avoiding atom table exhaustion just >>>>>>>> so >>>>>>>> they can use field punning (e.g. switching to `Jason.parse(.., keys: >>>>>>>> atoms)`) compelling, at all. There will always be people who find a >>>>>>>> way to >>>>>>>> do dumb things in their code, but languages (thankfully) don't base >>>>>>>> their >>>>>>>> designs on the premise that most of their users are idiots, and I >>>>>>>> don't see >>>>>>>> why it would be any different here. >>>>>>>> >>>>>>>> I've seen this debate come up over and over since the very first >>>>>>>> time it was brought up on this list, and there is a good reason why it >>>>>>>> keeps dying on the vine. The justification for field punning is weak >>>>>>>> to >>>>>>>> begin with, largely sugar that benefits the code author rather than >>>>>>>> the >>>>>>>> reader, and syntax sugar must carry its own weight in the language, >>>>>>>> and the >>>>>>>> only chance of that here is by building on the foundations laid by >>>>>>>> other >>>>>>>> languages which have it. Doing so means readers are much more likely >>>>>>>> to >>>>>>>> recognize the syntax for what it is, it adds no new sigils/operators, >>>>>>>> and >>>>>>>> it is narrowly scoped yet still convenient in many common scenarios. >>>>>>>> If >>>>>>>> anything, the desire to make this work for string keys is what keeps >>>>>>>> killing this feature, not the other way around. >>>>>>>> >>>>>>>> I really don't want this thread to devolve into argument like many >>>>>>>> of the others on this topic, but making statements like "a barewords >>>>>>>> implementation is not viable in Elixir" is not doing any favors. It is >>>>>>>> factually untrue, and the premise of the statement is based entirely >>>>>>>> on an >>>>>>>> opinion. If this thread is going to have any hope of making progress, >>>>>>>> broad >>>>>>>> assertions of that nature better be backed up with a lot of objective >>>>>>>> data. >>>>>>>> Make the case why *extra* syntax is better than the more limited >>>>>>>> barewords-only implementation, for example, by enabling support for >>>>>>>> string >>>>>>>> keys, by offering a syntax construct that can be used in more places, >>>>>>>> etc. >>>>>>>> It isn't necessary for your proposal to torpedo other solutions in >>>>>>>> order to >>>>>>>> succeed, and has a better chance of doing so if you don't. >>>>>>>> >>>>>>>> Paul >>>>>>>> >>>>>>>> On Thu, Jun 29, 2023, at 12:40 AM, Christopher Keele wrote: >>>>>>>> >>>>>>>> > This proposal mentions OCaml, Haskell and JS as prior works of >>>>>>>> art for >>>>>>>> > this type of feature. I think a key thing to point out is that in >>>>>>>> those >>>>>>>> > languages, they did not need to add additional syntax in order to >>>>>>>> > support this. >>>>>>>> >>>>>>>> This is true, and the discomfort extends to Ruby as well. >>>>>>>> >>>>>>>> For reasons explained in Austin's reply >>>>>>>> <https://groups.google.com/g/elixir-lang-core/c/P6VprVlRd6k/m/ijxO7HdpAgAJ>, >>>>>>>> >>>>>>>> a "barewords" implementation is not viable in Elixir, because of the >>>>>>>> prevalence of both atom and string key types. >>>>>>>> >>>>>>>> IMO, discussing the nuance of if a barewords representation should >>>>>>>> prefer atoms or keys is what has been continually holding this feature >>>>>>>> up >>>>>>>> for a decade, and that's what this proposal tries to move past. >>>>>>>> >>>>>>>> Perhaps in an ideal Elixir 2.0 future if we get garbage collection >>>>>>>> of atoms like Ruby, Phoenix can move over to parsing params with >>>>>>>> atom-based >>>>>>>> key pairs, we can drop the operator and atom/string differentiation, >>>>>>>> and >>>>>>>> move the entire syntax over to barewords. Worth calling out that this >>>>>>>> proposal (with a new operator, not the capture operator) could remain >>>>>>>> backwards-compatible with the proposed syntax if we moved into an >>>>>>>> atom-oriented Phoenix params parsing Elixir 2.0 future. >>>>>>>> >>>>>>>> As Elixir 2.0 may never get released, famously, this is the only >>>>>>>> clear path I see forward for our production applications today to get >>>>>>>> field >>>>>>>> punning, that skirts issues with prior art. >>>>>>>> On Wednesday, June 28, 2023 at 11:27:48 PM UTC-5 me wrote: >>>>>>>> >>>>>>>> This proposal mentions OCaml, Haskell and JS as prior works of art >>>>>>>> for >>>>>>>> this type of feature. I think a key thing to point out is that in >>>>>>>> those >>>>>>>> languages, they did not need to add additional syntax in order to >>>>>>>> support this. >>>>>>>> >>>>>>>> In OCaml, the syntax goes from >>>>>>>> >>>>>>>> { foo = foo; bar = bar } >>>>>>>> >>>>>>>> to >>>>>>>> >>>>>>>> { foo; bar } >>>>>>>> >>>>>>>> Haskell starts with >>>>>>>> >>>>>>>> C { foo = foo, bar = bar } >>>>>>>> >>>>>>>> and turns into >>>>>>>> >>>>>>>> C { foo, bar } >>>>>>>> >>>>>>>> And lastly, Javascript uses >>>>>>>> >>>>>>>> { foo: foo, bar: bar } >>>>>>>> >>>>>>>> which can be used as >>>>>>>> >>>>>>>> { foo, bar } >>>>>>>> >>>>>>>> Note the lack of additional syntax surrounding these features. >>>>>>>> >>>>>>>> > {foo, bar, baz} = {1, 2, 3} >>>>>>>> > >>>>>>>> > %{$:foo, "fizz" => "buzz", $"bar", fizz: :buzz} >>>>>>>> > # => %{:fizz => :buzz, :foo => 1, "bar" => 2, "fizz" => "buzz"} >>>>>>>> >>>>>>>> If I were coming from one of the above languages (or any other >>>>>>>> language >>>>>>>> that supports this feature), I would not look at this syntax and say >>>>>>>> "This is field punning". I would have no intuition what is going on. >>>>>>>> >>>>>>>> Speaking as someone that has a decent amount of Elixir experience, >>>>>>>> $"bar" looks like it should be closer in functionality to :"bar" >>>>>>>> than >>>>>>>> field punning. Or maybe even similar to using ? to find the >>>>>>>> codepoint of >>>>>>>> a single character. Something to keep in mind, Erlang actually uses >>>>>>>> $ >>>>>>>> for the same purpose that Elixir uses ?. I'm not saying Elixir >>>>>>>> couldn't >>>>>>>> use the same token/operator for a different purpose, I just think >>>>>>>> it is >>>>>>>> something that should be considered. >>>>>>>> >>>>>>>> Justin >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> 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 elixir-lang-co...@googlegroups.com. >>>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/aee0f98a-9b9b-4ff0-9a48-08d4e31df8c5n%40googlegroups.com >>>>>>>> >>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/aee0f98a-9b9b-4ff0-9a48-08d4e31df8c5n%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 elixir-lang-co...@googlegroups.com. >>>>>>>> >>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/72586965-c3ee-42c0-b7d3-7e863ace2706%40app.fastmail.com >>>>>>>> >>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/72586965-c3ee-42c0-b7d3-7e863ace2706%40app.fastmail.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 elixir-lang-co...@googlegroups.com. >>>>>> >>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/elixir-lang-core/7134e702-f9b2-44ad-bf33-3b8a633862d7n%40googlegroups.com >>>>>> >>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/7134e702-f9b2-44ad-bf33-3b8a633862d7n%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 elixir-lang-co...@googlegroups.com. >>>> >>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/elixir-lang-core/d265a338-e815-4e6b-a541-e61e2ec89611n%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/elixir-lang-core/d265a338-e815-4e6b-a541-e61e2ec89611n%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 elixir-lang-co...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/elixir-lang-core/d0d6b9a6-b2d0-4a83-8cc0-f8580e151404n%40googlegroups.com > > <https://groups.google.com/d/msgid/elixir-lang-core/d0d6b9a6-b2d0-4a83-8cc0-f8580e151404n%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 elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/4b0b7343-2d02-4424-9341-8d33c45be40fn%40googlegroups.com.