This is a separate convo but I don’t see value in adding a primary syntax for sets given we can’t really use it in pattern matching. A syntax for only adding and removing set elements is, IMO, not worth it.
On Thu, Jun 29, 2023 at 11:21 Christopher Keele <christheke...@gmail.com> wrote: > > 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 > <https://groups.google.com/d/msgid/elixir-lang-core/4b0b7343-2d02-4424-9341-8d33c45be40fn%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/CAGnRm4Jfqz6tO7mFf-qprquo1%2BxYR7CKe14fVOAxx9A0YGYw%2Bw%40mail.gmail.com.