[Proposal] Shorter maps

65 views
Skip to first unread message

Kelvin Raffael Stinghen

unread,
Sep 22, 2017, 10:58:52 AM9/22/17
to elixir-lang-core
I really liked the lib https://github.com/meyercm/shorter_maps. It makes the maps creation and matching a lot more DRY.

Some examples for those who don't want to open the repo:

iex> import ShorterMaps
...> name = "Chris"
...> id = 6
...> ~M{name, id}
%{name: "Chris", id: 6}

# It's ok to mix in other expressions:
...> ~M{name, id: id + 200}
%{name: "Chris", id: 206}

# or even nest the sigil (note the change in delimiters to paren):
...> ~M{name, id, extra_copy: ~M(name, id)}
%{name: "Chris", id: 6, extra_copy: %{name: "Chris", id: 6}}

# We can use String keys:
...> ~m{name, id}
%{"name" => "Chris", "id" => 6}

# And we can update existing maps:
...> map_1 = %{name: "Bob", id: 9}
...> ~M{map_1|name}
%{name: "Chris", id: 9}

# Struct syntax is a little funky:
...> defmodule MyStruct do
...>   defstruct [id: nil, name: :default]
...> end
...> ~M{%MyStruct id}
%MyStruct{id: 6, name: :default}

# Structs can be updated too:
...> initial_struct = %MyStruct{name: "Chris", id: :unknown}
...> ~M{%MyStruct initial_struct|id}
%MyStruct{name: "Chris", id: 6}

# Because the expansion happens at compile time, they can be used __anywhere__:

# in function heads:
...> defmodule MyModule do
...>   def my_func(~M{name, _id}), do: {:id_present, name}
...>   def my_func(~M{name}), do: {:no_id, name}
...> end

# in pattern matches:
...> ~M{age, model} = %{age: -30, model: "Delorean", manufacturer: "AMC"}
...> age
-30

What do you think about incorporating it to the language? I would even suggest to implement it without the use of sigils. Something like:

...> %{name, id}
%{name: "Chris", id: 6}
...> %MyStruct{id}
%MyStruct{id: 6, name: :default}


What do you think?

José Valim

unread,
Sep 22, 2017, 11:03:56 AM9/22/17
to elixir-l...@googlegroups.com
Hi Kelvin!

This has been proposed a couple times. I think the original code even started from a mailing list discussion. I recommend reading those previous discussions for more insight.

--


José Valim
Founder and 
Director of R&D

Kelvin Raffael Stinghen

unread,
Sep 22, 2017, 11:05:14 AM9/22/17
to elixir-l...@googlegroups.com
OK, sorry for the duplicated proposal. My fault! 😬
--
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/7d18ef9a-5ae9-42df-8003-58ad8f3b2abb%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
Message has been deleted
0 new messages