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?

-- 
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 [email protected].
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 via email to