On Thu, Jun 29, 2023 at 3:02 AM José Valim <jose.va...@dashbit.co> 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
>

`:` isn’t an operator in JS, but it is part of the `?:` ternary operator.
In all other contexts (object construction, object deconstruction /
aliasing, case statements in switches), `:` is syntax.

* Elixir and Ruby shares a lot syntax wise, it may be worth revisiting what
> they do and which points arose in their discussions/implementations
>

In many ways it is a shame that Elixir adopted the `%{"foo": bar}` syntax
meaning the same as `%{:"foo" => bar}`, because otherwise we *could* adopt
the Ruby key deconstruction approach for atoms, strings, and charlists
(`%{foo:, "bar":, 'baz':} = %{:foo => 1, "bar" => 2, 'baz' => 3}`) … and
the discussion could be over. :D

-a


> On Thu, Jun 29, 2023 at 8:51 AM Paul Schoenfelder <
> paulschoenfel...@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-core+unsubscr...@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-core+unsubscr...@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-core+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4J9KtN20_9dsew-7uXeND847Eysda1y7uq%3D_B-T5eF6yA%40mail.gmail.com
> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4J9KtN20_9dsew-7uXeND847Eysda1y7uq%3D_B-T5eF6yA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>


-- 
Austin Ziegler • halosta...@gmail.com • aus...@halostatue.ca
http://www.halostatue.ca/http://twitter.com/halostatue

-- 
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/CAJ4ekQutxiEPiT5q8xTHTsaZjShZBUHi297nnP6chKU1aETciw%40mail.gmail.com.

Reply via email to