I believe that printing expressions is what python usually does in their 
inspect implementation. It does help a lot with copy & paste when working with 
the shell.

From: elixir-lang-core@googlegroups.com <elixir-lang-core@googlegroups.com> on 
behalf of José Valim <jose.va...@dashbit.co>
Date: Monday, 7 February 2022 at 13:57
To: elixir-lang-core <elixir-lang-core@googlegroups.com>
Subject: Re: [elixir-core:10767] [Proposal] Update MapSets with pattern 
matching, assignments, update shorthand, etc.
And for all of those cases, if we the concern is inspections, there is always 
the option of printing an expression, such as:

MapSet.new([1, 2, 3])
URI.parse("https://foo/bar";)
Version.parse!("1.0.0")

It doesn't address the concerns about pattern matching though.

On Mon, Feb 7, 2022 at 2:31 PM Wojtek Mach 
<woj...@wojtekmach.pl<mailto:woj...@wojtekmach.pl>> wrote:
Regarding `%MapSet[1, 2]`, I think it looks really nice.

Regarding multi-letter sigils, I think we should have those but not for this 
particular use case. Sigils are for textual representations so not a good fit 
for "containers" like MapSet, Vector, etc, when evaluating `%MapSet[...]` we 
want to evaluate the items inside as _code_ not as _text_ (which the sigil 
would). There's also the sigil escaping that José mentioned.

This begs the question do we have `%MapSet[1, 2]` AND `~Version[1.0.0]` and I'd 
say YES but I totally can see why they maybe look a bit too similar with pretty 
different semantics and thus it's one or the other (or none!)

Regarding the gist,

iex> enum = [:foo, :bar, "set"]

...> %[enum]

%[:foo, :bar, "set"]

I think this should be `%[[:foo, :bar, "set"]]`. :) Otherwise `%[x]` is 
different than `%[x, y]` which feels unpredictable.

def function_2(%[:foo])

what are semantics of this pattern match? Does it match when the given set is:

1. a subset of `%[:foo]`
2. when it is exactly the same?

# Match and update - like `%{map | key: new_val}`

iex> set = %[%User{id: 1}]

iex> %[set | %User{} => %User{id: 2}]

note, on maps we cannot do `%{map | %User{} => %User{id: 2}}` today. I mean, we 
can, but it doesn't do what you want it to do, it would try to update a key 
that `%User{}` evaluates to, something like `%User{id: nil, ...}`. Changing the 
semantics would be a breaking change. It's unclear how it should work when it 
matches multiple elements, do we update all of them? That's not obvious!
On February 7, 2022, "a-corp.co.uk<http://a-corp.co.uk>" 
<a...@a-corp.co.uk<mailto:a...@a-corp.co.uk>> wrote:
This is tricky for me. While I am sympathetic to the feature, I think this 
would be the first time abstraction was added to pattern matching so we'd need 
to be careful.

Up to now the pattern matching syntax uses the same syntax that you use to 
create the literal data that is being matched. Eg for a map pattern we write a 
map

%{a: variable} = %{a: 1}

This brings clarity because the pattern describes the data you are matching on 
- when you read the pattern you can see right away what the expected data is (a 
map).

The proposal sketched in the Gist would add indirection to pattern matching by 
introducing a new syntax - syntax that is specific to one abstract data 
structure (the map set).

By abstracting away the details of the data structure being matched on we 
reduce the clarity we usually get, we introduce more syntax into the language, 
and we open the floodgates
to whether we should have pattern matching on more abstract data types - 
Ranges, URIs... DateTimes etc. At which point the question really becomes 
"should we have abstract patterns
in Elixir" which I think is harder to answer.

In the meantime looking at ex_pat might be valuable to you because it would 
allow you to reach into the details of a MapSet with pattern matching in a 
controlled way that meant if the implementation
details of a MapSet changes it wouldn't break you program too much.

https://github.com/vic/expat

Just my two cents though!

Best

Adam

On 7 Feb 2022, at 10:33, SJ 
<hellobenjamindank...@gmail.com<mailto:hellobenjamindank...@gmail.com>> wrote:

Hi all.

I have set out a proposal of what these things could potentially look like.

https://gist.github.com/bdanklin/f4fc015fa90e9b33bb8cb580344e1258

I searched for prior work in this area and couldn't find any.

If it's a welcome feature I'd be happy to work on it given some direction of 
where to start.

Thanks for any feedback.

Best

--
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<mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/a73ced4a-5f61-4f40-bbba-8ed2749a3e62n%40googlegroups.com<https://groups.google.com/d/msgid/elixir-lang-core/a73ced4a-5f61-4f40-bbba-8ed2749a3e62n%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<mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/8A766BAC-F075-4B54-9C6D-AC53A46FAAEF%40a-corp.co.uk<https://groups.google.com/d/msgid/elixir-lang-core/8A766BAC-F075-4B54-9C6D-AC53A46FAAEF%40a-corp.co.uk?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<mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/85fe66455010f9204ffe4cd47bc726e5ecf6b023%40hey.com<https://groups.google.com/d/msgid/elixir-lang-core/85fe66455010f9204ffe4cd47bc726e5ecf6b023%40hey.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<mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4KOuXD4P3c%2Bkxa0O56qYbM9h_m39aHEKQJar_6Yo3winw%40mail.gmail.com<https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4KOuXD4P3c%2Bkxa0O56qYbM9h_m39aHEKQJar_6Yo3winw%40mail.gmail.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/AS8P192MB136754EA28F984D859A96B0FFA2C9%40AS8P192MB1367.EURP192.PROD.OUTLOOK.COM.

Reply via email to