<div dir="ltr"><div>Thanks for the replies so far!</div><div><br></div>Interesting to see that people don't like using records past module boundaries, we extensively use them that way (which might change with the new map feature). In our solution we have a few "data types" that get passed around to different processes to do things, and also we use something like a message bus to have subscribe/unsubscribe functionality for which we use records as messages. For us this works really well, proven by the countless refactorings being done (inside processes but also complete restructuring of how processes are tied together).<div>
<br></div><div>Now I am not saying you are wrong obviously, but thought it was worth putting this "other" experience in the group as well.</div><div><br></div><div>-Mark</div><div><br></div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Sat, Feb 1, 2014 at 10:08 PM, Loïc Hoguin <span dir="ltr"><<a href="mailto:essen@ninenines.eu" target="_blank">essen@ninenines.eu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I think for most users and most use cases maps will completely take over records.<br>
<br>
Reason 1: Records today are already only usable inside a single module.<br>
<br>
Records need to be defined. This means that if you want your record to be available across more than one module you need to either duplicate the definition or put it in an include file. But doing this means that you're leaking out the record definition all across your application, which makes changing said definition harder (and code upgrades almost impossible to get right).<br>

<br>
A good practice deriving from that is to make sure records never leave one module, or at the very least that they never get accessed from outside that module (using -opaque). That makes records workable, but limits their usefulness.<br>

<br>
Reason 2: Upgrading a process state that uses records is terrifying.<br>
<br>
Well here's a good explanation of why it's terrifying and sucks horribly: <a href="http://erlang.org/pipermail/erlang-questions/2014-February/076765.html" target="_blank">http://erlang.org/pipermail/<u></u>erlang-questions/2014-<u></u>February/076765.html</a><br>

<br>
For maps at worst you just do M#{ new_field => default_value } and are done with it.<br>
<br>
Reason 3: Records are cumbersome to use.<br>
<br>
Many hate the record syntax. Many also would prefer to avoid the record definition entirely when prototyping some code. And they should! Maps aren't slowing down your work the way records do. And guess what. Most of the time the prototype of an Erlang process is good enough for production use.<br>

<br>
You lose Dialyzer. That's the big drawback. But most processes' state is smallish so mistakes are hard to make and quickly found anyway.<br>
<br>
Some will also argue that records are FAST and maps aren't. But for most processes it doesn't matter. And I will even go as far as saying that this isn't necessarily true. Records allocate fully at creation, maps only when needed. You can easily only set keys that are different from the defaults in the map, keep it small and potentially beating records entirely.<br>

<br>
</Reasons><br>
<br>
These are the three main reasons I think maps will take over. Personally I will probably still use records for most processes' state because I like Dialyzer, might consider using records where speed is a huge requirement (after careful measurements) but anywhere else? Maps. Maps all the way, baby.<br>

<br>
Maps will also completely beat proplists to death, burn their brackets and eat their hearts. I don't think I need to explain why.<br>
<br>
Seeing maps used in place of records will probably not make everyone happy. Oh well. They might even say you're WRONG (madness!) to use them in this or that scenario, and insistently ask WHY you are doing something so CRAZY. But you know. Whatever works.<div class="im">
<br>
<br>
On 02/01/2014 06:30 PM, Mark Nijhof wrote:<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
Hi Joe (and the rest of the list),<br>
<br>
Ok right up front, I'm not a Guru, I have only been working with Erlang<br>
for about 7 happy months :-)<br>
<br>
I have a question about the "Records are dead - long live maps"<br>
statement you make in your post. One of the nice things I like about<br>
records is is that they are a "typed" collection of key->value pairs.<br>
When I pass a record around I can look up the definition and know what I<br>
can and cannot do with it, and also see what a function expects. Also<br>
pattern matching purely on the record type is a great initial filter.<br>
When I look at maps they look more like a proplist replacement,<br>
something that is just as flexible (more so I guess) but with better usage?<br>
<br>
So the question really is, how do you see maps replacing records? Would<br>
we add a map_type property to the map to distinguish between different<br>
maps? Or purely on it's data structure it self?<br>
<br>
If this is a silly question then I am happy to read about it in one of<br>
your awesome rants.<br>
<br>
-Mark<br>
<br>
<br>
<br>
<br>
On Sat, Feb 1, 2014 at 5:34 PM, Joe Armstrong <<a href="mailto:erlang@gmail.com" target="_blank">erlang@gmail.com</a><br></div><div class="im">
<mailto:<a href="mailto:erlang@gmail.com" target="_blank">erlang@gmail.com</a>>> wrote:<br>
<br>
<br>
<br>
<br>
    On Fri, Jan 31, 2014 at 10:51 PM, Kenneth Lundin<br></div><div><div class="h5">
    <<a href="mailto:kenneth.lundin@gmail.com" target="_blank">kenneth.lundin@gmail.com</a> <mailto:<a href="mailto:kenneth.lundin@gmail.com" target="_blank">kenneth.lundin@gmail.<u></u>com</a>>> wrote:<br>
<br>
        Erlang/OTP 17.0-rc1 has been released.<br>
<br>
<br>
    Fantastic - great - this is a major change to Erlang.<br>
<br>
    I've written an article that documents the biggest changes.<br>
<br>
    Big changes to Erlang<br>
    <a href="http://joearms.github.com/2014/02/01/big-changes-to-erlang.html" target="_blank">http://joearms.github.com/<u></u>2014/02/01/big-changes-to-<u></u>erlang.html</a><br>
<br>
    Cheers<br>
<br>
    /Joe<br>
<br>
        This is an alpha release, which will be followed by a planned<br>
        beta release about a month later and a final<br>
        OTP 17.0 product release in the end of March 26, 2014.<br>
        Between the alpha and beta and final release there will be new<br>
        updates of the master branch with corrections<br>
        and minor new features. Occasionally there might be new tags<br>
        which we in that<br>
        case will communicate and ask you to test.<br>
<br>
        Erlang/OTP 17.0 is a new major release with new features, quite<br>
        a few (characteristics) improvements,<br>
        as well as some incompatibilities. See the README file and the<br>
        documentation for more details.<br>
<br>
        We would like to ask you to download and test the alpha release<br>
        and send us your feedback as soon as possible,<br>
        so that we can make the necessary corrections before OTP<br>
        17.0-rc2 and OTP 17.0, respectively.<br>
        The release contains many changes; thus, some unexpected<br>
        incompatibilities or issues may have slipped through<br>
        our tests. Please try to build and run your current<br>
        products/applications and let us know about any problems.<br>
<br>
        Note! The new datatype MAP is not properly documented yet but<br>
        the EEP 43 <a href="http://www.erlang.org/eeps/eep-0043.html" target="_blank">http://www.erlang.org/eeps/<u></u>eep-0043.html</a><br>
        will provide a good start. Also note that it is a limited<br>
        implementation of maps implemented so far:<br>
<br>
             - no variable keys are allowed<br>
             - native code can not be generated for modules using maps<br>
<br>
        Some other highlights of the release are:<br>
<br>
             - Maps, a new dictionary data type (experimental)<br>
             - A more natural mapping from ASN.1 OCTET STRING and BIT<br>
        STRING to Erlang types,<br>
               and other ASN.1 improvements and optimizations<br>
             - The {active, N} socket option for TCP, UDP, and SCTP<br>
             - A new (optional) scheduler utilization balancing mechanism<br>
             - Migration of memory carriers has been enabled by default<br>
        on all ERTS internal<br>
               memory allocators<br>
             - Increased garbage collection tenure rate<br>
             - Experimental "dirty schedulers" functionality<br>
             - Funs can now be given names<br>
             - Miscellaneous unicode support enhancements<br>
             - A new, semantic version scheme for OTP and its applications<br>
<br>
        You can find the README file with more detailed info at<br>
<br>
        <a href="http://www.erlang.org/download/otp_src_17.0-rc1.readme" target="_blank">http://www.erlang.org/<u></u>download/otp_src_17.0-rc1.<u></u>readme</a><br>
<br>
        You can download the full source distribution from<br>
<br>
        <a href="http://www.erlang.org/download/otp_src_17.0-rc1.tar.gz" target="_blank">http://www.erlang.org/<u></u>download/otp_src_17.0-rc1.tar.<u></u>gz</a><br>
        <a href="http://www.erlang.org/download/otp_src_17.0-rc1.readme" target="_blank">http://www.erlang.org/<u></u>download/otp_src_17.0-rc1.<u></u>readme</a> (this file)<br>
<br>
        Note: To unpack the TAR archive you need a GNU TAR compatible<br>
        program.<br>
<br>
        For installation instructions please read the README that is<br>
        part of the distribution.<br>
<br>
        You can also find this release at the official Erlang/OTP<br>
        Git-repository at Github here:<br>
<br>
        <a href="https://github.com/erlang/otp" target="_blank">https://github.com/erlang/otp</a> tagged *OTP_17.0-rc1*<br>
<br>
<br>
        The Windows binary distribution can be downloaded from<br>
<br>
        <a href="http://www.erlang.org/download/otp_win32_17.0-rc1.exe" target="_blank">http://www.erlang.org/<u></u>download/otp_win32_17.0-rc1.<u></u>exe</a><br>
        <a href="http://www.erlang.org/download/otp_win64_17.0-rc1.exe" target="_blank">http://www.erlang.org/<u></u>download/otp_win64_17.0-rc1.<u></u>exe</a><br>
<br>
<br>
        On-line documentation can be found at <a href="http://www.erlang.org/doc/" target="_blank">http://www.erlang.org/doc/</a>.<br>
        You can also download the complete HTML documentation or the<br>
        Unix manual files<br>
<br>
        <a href="http://www.erlang.org/download/otp_doc_html_17.0-rc1.tar.gz" target="_blank">http://www.erlang.org/<u></u>download/otp_doc_html_17.0-<u></u>rc1.tar.gz</a><br>
        <a href="http://www.erlang.org/download/otp_doc_man_17.0-rc1.tar.gz" target="_blank">http://www.erlang.org/<u></u>download/otp_doc_man_17.0-rc1.<u></u>tar.gz</a><br>
<br>
        We also want to thank those that sent us patches, suggestions<br>
        and bug reports.<br>
<br>
        The Erlang/OTP Team at Ericsson<br>
<br>
<br>
        ______________________________<u></u>_________________<br>
        erlang-questions mailing list<br></div></div>
        <a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a> <mailto:<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@<u></u>erlang.org</a>><div class="im">
<br>
        <a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a><br>
<br>
<br>
<br>
    ______________________________<u></u>_________________<br>
    erlang-questions mailing list<br></div>
    <a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a> <mailto:<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@<u></u>erlang.org</a>><div class="im">
<br>
    <a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a><br>
<br>
<br>
<br>
<br>
--<br>
Mark Nijhof<br></div>
t: @MarkNijhof <<a href="https://twitter.com/MarkNijhof" target="_blank">https://twitter.com/<u></u>MarkNijhof</a>><br>
s:  marknijhof<div class="im"><br>
<br>
<br>
<br>
______________________________<u></u>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a><br>
<br>
</div></blockquote><span class="HOEnZb"><font color="#888888">
<br>
-- <br>
Loïc Hoguin<br>
<a href="http://ninenines.eu" target="_blank">http://ninenines.eu</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Mark Nijhof<br><div><div>t:   <a href="https://twitter.com/MarkNijhof" target="_blank">@MarkNijhof</a><br>s:  marknijhof</div></div>
<div><br></div></div>
</div>