<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I don’t love any of the specific suggestions so far, but saving 3 + 2n keystrokes isn't the point – readability and learnability are. Visually, `new Map([[‘foo’, 42]])` is a mess.</div><br class=""><div><blockquote type="cite" class=""><div class="">On Oct 28, 2015, at 9:28 AM, Michał Wadas <<a href="mailto:michalwadas@gmail.com" class="">michalwadas@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class=""><div class="">Difference between any proposed here syntax and current state ( new Map([ [1,2], [2,3] ]); ) is..<br class=""><br class=""></div>3 characters + 2 characters/entry.<br class=""><br class=""></div><br class=""><div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">2015-10-28 17:22 GMT+01:00 Mohsen Azimi <span dir="ltr" class=""><<a href="mailto:me@azimi.me" target="_blank" class="">me@azimi.me</a>></span>:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">When I look at `Map#{"foo": 42}` I don't see much difference with `new Map([['foo', 42]])`.<div class=""><br class=""></div><div class="">Since you can pass expressions there, it's already possible to do it with current syntax. There is only a bunch of extra brackets(`[` and `]`) that I don't like.</div><div class=""><br class=""></div></div><div class="HOEnZb"><div class="h5"><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Wed, Oct 28, 2015 at 5:51 AM Alexander Jones <<a href="mailto:alex@weej.com" target="_blank" class="">alex@weej.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ah, there is actually a good case for keeping barewords in object literals but removing them from map literals, and that's due to objects accessing string properties as bare words, too. This is almost never the case for other map types.<div class=""><br class=""></div><div class="">```</div><div class="">const o = {foo: 42};</div><div class="">o.foo === 42;</div><div class="">o.bar = 43;</div><div class=""><br class=""></div><div class="">const m = Map#{"foo": 42};</div><div class="">m.get("foo") === 42;</div><div class="">m.set("bar", 43);</div><div class="">```</div><div class=""><br class=""></div><div class="">Would you agree?</div><div class=""><span class=""></span><br class=""><br class="">On Wednesday, 28 October 2015, Alexander Jones <<a href="mailto:alex@weej.com" target="_blank" class="">alex@weej.com</a>> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Herby<div class=""><br class=""></div><div class="">Agree with your concerns about symmetry with object literals, but many of the uses of maps benefit from having non string keys, and in such case generally everything would involve wrapping in []. Trying to use an Array as a key would be quite ugly with the extra squares required</div><div class=""><br class=""></div><div class="">```</div><font size="2" class=""><span style="background-color:rgba(255,255,255,0)" class="">const precachedResults = MyMap#{[[1, 2, 3]]: [1, 4, 9]}</span></font><br class=""><div class="">vs</div><div class=""><font size="2" class=""><span style="background-color:rgba(255,255,255,0)" class="">const precachedResults = MyMap#{[1, 2, 3]: [1, 4, 9]}</span></font></div><div class=""><div class="">```</div><div class=""><br class=""></div><div class="">Perhaps a middle ground could be that if you want to use an expression that would otherwise be a bare word, you enclose in parens. The visual binding of the colon is deceptive anyway, so I tend to do this if the key expression contains a space:</div><div class=""><br class=""></div><div class="">```</div><div class=""><font size="2" class=""><span style="background-color:rgba(255,255,255,0)" class="">MyMap#{1 + 2 + 3: 6}</span></font><br class=""></div><div class="">vs.</div><div class=""><span style="font-size:small;background-color:rgba(255,255,255,0)" class="">MyMap#{(1 + 2 + 3): 6}</span></div><div class="">```</div><div class=""><br class=""></div><div class="">But I think I still prefer that the parsing for the key part is just standard expression evaluation, personally, and the POJSO literal barewords remain the only special case.</div><div class=""><br class=""></div><div class="">Indeed,</div><div class=""><br class=""></div><div class="">```</div><div class="">Object#{1: "one", Symbol(): "sym"}</div><div class="">```</div><div class=""><br class=""></div><div class="">Could Object-key-ify the keys, i.e. turn them into strings if not symbols, and Just Work (but a default implementation on the Object prototype is questionable!). That said I'm not sure we should be using Object for this kind of thing. At this point I don't know what a raw `#{}` should produce... There may be a better use case for it in the future, horrible ASI complexities notwithstanding.</div><div class=""><br class=""></div><div class="">Alex</div><div class=""><br class=""></div><br class=""><div class="">On Wednesday, 28 October 2015, Herby Vojčík <<a class="">herby@mailbox.sk</a>> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="">
<br class="">
Alexander Jones wrote:<br class="">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Ok, thanks for clarifying. Not only does it preserve order but it also<br class="">
permits non-string keys. You're still missing one detail which is that<br class="">
`bar` would actually be a variable not a string key.<br class="">
<br class="">
Another example to clarify that the key part would be an expression:<br class="">
<br class="">
```<br class="">
Map#{foo(42) + 7: "bar"}<br class="">
```<br class="">
<br class="">
I prefer this over the precedent set by object literals which would<br class="">
require that [] are used around a key expression ("computed key") simply<br class="">
</blockquote>
<br class="">
I, on the other hand, think it should match object literals completely. So your example would be<br class="">
<br class="">
```<br class="">
Map#{[foo(42)+7]: "bar"}<br class="">
```<br class="">
<br class="">
Yes, it's just for consistency and less WTF moment while learning the details.<br class="">
<br class="">
OTOH, there could be consistent contraproposal of:<br class="">
<br class="">
```<br class="">
Object#{foo(42) + 7: "bar"}<br class="">
null#{foo(42) + 7: "bar"}<br class="">
#{foo(42) + 7: "bar"}<br class="">
```<br class="">
<br class="">
where the first is equivalent to {[foo(42)+7]: "bar"}, the second is pure container (Object.create(null)) filled with properties, and the third is the default case, but I don't know which of the previous two - the first is probably less confusing, though the feels more clean.<br class="">
<br class="">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
due to relieving the syntax noise, which is what this idea is all about.<br class="">
Also, this is how it works in Python and I make no apologies about the<br class="">
similarities ;)<br class="">
<br class="">
Alex<br class="">
<br class="">
On Wednesday, 28 October 2015, Viktor Kronvall<br class="">
<<a class="">viktor.kronvall@gmail.com</a> <mailto:<a class="">viktor.kronvall@gmail.com</a>>> wrote:<br class="">
<br class="">
    Hello Alexander,<br class="">
<br class="">
    I see now that I misread your desugaring.<br class="">
<br class="">
    I read:<br class="">
<br class="">
    ```<br class="">
    Map#{1: 6, bar: 'Hello', 2: 8};<br class="">
    ```<br class="">
    as being desugared to:<br class="">
<br class="">
    ```<br class="">
    Map[Symbol.literalOf]({1: 6, bar: 'Hello', 2: 8}[Symbol.iterator]());<br class="">
    ```<br class="">
<br class="">
    But your proposal clearly states that is should be:<br class="">
<br class="">
    ```<br class="">
    Map[Symbol.literalOf]([[1, 6], ['bar', 'Hello'],<br class="">
    [2,8]][Symbol.iterator]());<br class="">
    ```<br class="">
<br class="">
    Which would preserve lexical ordering of entries. The fault is<br class="">
    completely mine. Sorry.<br class="">
<br class="">
    I like this proposal as it is extensible and not that noisy in<br class="">
    syntax. Using the `#` for this doesn't<br class="">
    seem like a bad idea either. People coming from Erlang will be<br class="">
    familiar with this as well.<br class="">
<br class="">
<br class="">
    2015-10-28 10:53 GMT+01:00 Alexander Jones <<a class="">alex@weej.com</a><br class="">
    <javascript:_e(%7B%7D,'cvml','<a class="">alex@weej.com</a>');>>:<br class="">
<br class="">
        Hi Victor<br class="">
<br class="">
        Not sure I understand - the desugaring I wrote would absolutely<br class="">
        preserve the written ordering because it speaks in terms of an<br class="">
        ArrayIterator of key-value pairs. If the map type to which it's<br class="">
        applied chooses to forget the ordering then that's fine.<br class="">
<br class="">
        Alex<br class="">
<br class="">
<br class="">
        On Wednesday, 28 October 2015, Viktor Kronvall<br class="">
        <<a class="">viktor.kronvall@gmail.com</a><br class="">
        <javascript:_e(%7B%7D,'cvml','<a class="">viktor.kronvall@gmail.com</a>');>> wrote:<br class="">
<br class="">
             > ```<br class="">
            >  const map = IMap#{"foo": 42, bar: 44};<br class="">
            >  ```<br class="">
             > It could desugar as, for the sake of example:<br class="">
             ><br class="">
             > ```<br class="">
             > Foo#{key: value, ...}<br class="">
             > ➔<br class="">
             > Foo[Symbol.literalOf]([[key, value], ...][Symbol.iterator]())<br class="">
             > ```<br class="">
<br class="">
            I like this proposal. However, Maps should guarantee<br class="">
            insertion order when traversing the keys and values and<br class="">
            desugaring it like that does not respect this guarantee or<br class="">
            more precisely it will lead to (in my opinion) unexpected<br class="">
            order of the keys.<br class="">
<br class="">
            ```<br class="">
            Object.keys({1: 6, bar: 'Hello', 2: 8}); // → [ '1', '2',<br class="">
            'bar' ]<br class="">
            ```<br class="">
<br class="">
            If I'm not mistaken this will be same order for `{1: 6, bar:<br class="">
            'Hello', 2: 8}[Symbol.iterator]()`.<br class="">
<br class="">
            This implies that:<br class="">
<br class="">
            ```<br class="">
            Map#{1: 6, bar: 'Hello', 2: 8};<br class="">
            ```<br class="">
<br class="">
            Will not have entries in the order `[[1, 6], ['bar',<br class="">
            'Hello'], [2,8]]` but instead `[[1,6], [2,8], ['bar','Hello']]`.<br class="">
<br class="">
            This means that possible future destructuring of a Map will<br class="">
            be harder to reason about.<br class="">
<br class="">
<br class="">
            2015-10-28 2:21 GMT+01:00 Alexander Jones <<a class="">alex@weej.com</a>>:<br class="">
<br class="">
                True, but easy to mess up and only be treated to a<br class="">
                runtime error. Three nested brackets at the start and<br class="">
                end could definitely be better, and this just encourages<br class="">
                people to use POJSOs instead. Also not a very uniform<br class="">
                interface if you look at how to construct a Map, Set or<br class="">
                Immutable.List at present, though admittedly constructor<br class="">
                call for the ES6 types would be a partial improvement.<br class="">
<br class="">
                On Wednesday, 28 October 2015, Tab Atkins Jr.<br class="">
                <<a class="">jackalmage@gmail.com</a>> wrote:<br class="">
<br class="">
                    On Wed, Oct 28, 2015 at 8:36 AM, Alexander Jones<br class="">
                    <<a class="">alex@weej.com</a>> wrote:<br class="">
                     > I agree this is pretty important. Using actual<br class="">
                    maps really frees up a lot of<br class="">
                     > complexity, but the syntax is cumbersome to say<br class="">
                    the least.<br class="">
                     ><br class="">
                     > Whatever the decided syntax, bare words as string<br class="">
                    keys is a really bad idea<br class="">
                     > IMO. The key syntax should be parsed as an<br class="">
                    expression, like the values are,<br class="">
                     > and like they are in basically every other language.<br class="">
                     ><br class="">
                     > Another outstanding issue is that we might want<br class="">
                    the syntax for<br class="">
                     > `Immutable.Map`, or `WeakMap`, or `MapTwoPointOh`<br class="">
                    that improves deficiency<br class="">
                     > $x, $y and $z. I'd say introducing a special<br class="">
                    syntax for `Map` right now is<br class="">
                     > not ideal.<br class="">
<br class="">
                    Currently, the "extensible literal syntax" for this<br class="">
                    isn't that bad:<br class="">
<br class="">
                    const bar = 43;<br class="">
                    const map = Immutable.Map([["foo", 42], [bar, 44]]);<br class="">
<br class="">
                    It's a little more verbose because the entries have<br class="">
                    to be surrounded<br class="">
                    by [], but hey.<br class="">
<br class="">
                    ~TJ<br class="">
<br class="">
<br class="">
                _______________________________________________<br class="">
                es-discuss mailing list<br class="">
                <a class="">es-discuss@mozilla.org</a><br class="">
                <a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class="">
<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
es-discuss mailing list<br class="">
<a class="">es-discuss@mozilla.org</a><br class="">
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class="">
</blockquote>
</blockquote></div></div>
</blockquote></div>
_______________________________________________<br class="">
es-discuss mailing list<br class="">
<a href="mailto:es-discuss@mozilla.org" target="_blank" class="">es-discuss@mozilla.org</a><br class="">
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class="">
</blockquote></div>
</div></div><br class="">_______________________________________________<br class="">
es-discuss mailing list<br class="">
<a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class="">
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class="">
<br class=""></blockquote></div><br class=""></div>
_______________________________________________<br class="">es-discuss mailing list<br class=""><a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class="">https://mail.mozilla.org/listinfo/es-discuss<br class=""></div></blockquote></div><br class=""></body></html>