Struct creation / pattern matching short hand

One of my favorite new ES6 features in Javascript was the object literal shorthand, where:

const { location, venue_name } = { location: [30.2391, -99.1301], venue_name: "The Club" }
console.log(location)         // [30.2391, -99.1301]
console.log(venue_name)       // The Club

Additionally, I could do:

const extra_property = "some additional info"
const obj = { location, venue_name, extra_property }

But in Elixir, I find myself doing lots of

%{location: location, venue_name: venue_name} = struct
// process location and venue_name somehow
new_struct = %{location: location, venue_name: venue_name, extra_property: extra_property}

Is there any way in Elixir to do that similar struct desctructuring / creation shorthand (any way I can avoid typing venue_name twice), or how would I request it as a feature of the language in future iterations?

You could use one of the following libraries:

https://github.com/danielberkompas/destructure
https://github.com/meyercm/shorter_maps
https://github.com/whatyouhide/short_maps

Look at the archives of the elixir-core mailing list. It’s been discussed and denied as a core language feature. Look to libraries or write your own macros/sigil if you really feel the need for it.

Oh those libraries are perfect @zimt28 – thanks!

Smartass answer #1:

  • use tuples

Smartass answer #2:

  • The universal FP answer - write/use a (factory) function - e.g.:
    .

    new_struct = MyStruct.new location, venue_name, extra_property

Sorry, I couldn’t help myself (obviously).


Rebuttal

PS: There was a time where JavaScript was most hated for not being some other language one would much rather be working in. But I guess that was at a time where it was rare that anybody would learn to program in JavaScript first.

This should be another thread probably but that rebuttal is soooooo missing the point. But that is because it mix Design Pattern with architecture, which is a classic problem.