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.

> On Oct 28, 2015, at 9:28 AM, Michał Wadas <[email protected]> wrote:
> 
> Difference between any proposed here syntax and current state ( new Map([ 
> [1,2], [2,3] ]); ) is..
> 
> 3 characters + 2 characters/entry.
> 
> 
> 
> 
> 2015-10-28 17:22 GMT+01:00 Mohsen Azimi <[email protected] 
> <mailto:[email protected]>>:
> When I look at `Map#{"foo": 42}` I don't see much difference with `new 
> Map([['foo', 42]])`.
> 
> 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.
> 
> 
> On Wed, Oct 28, 2015 at 5:51 AM Alexander Jones <[email protected] 
> <mailto:[email protected]>> wrote:
> 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.
> 
> ```
> const o = {foo: 42};
> o.foo === 42;
> o.bar = 43;
> 
> const m = Map#{"foo": 42};
> m.get("foo") === 42;
> m.set("bar", 43);
> ```
> 
> Would you agree?
> 
> 
> On Wednesday, 28 October 2015, Alexander Jones <[email protected] 
> <mailto:[email protected]>> wrote:
> Hi Herby
> 
> 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
> 
> ```
> const precachedResults = MyMap#{[[1, 2, 3]]: [1, 4, 9]}
> vs
> const precachedResults = MyMap#{[1, 2, 3]: [1, 4, 9]}
> ```
> 
> 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:
> 
> ```
> MyMap#{1 + 2 + 3: 6}
> vs.
> MyMap#{(1 + 2 + 3): 6}
> ```
> 
> 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.
> 
> Indeed,
> 
> ```
> Object#{1: "one", Symbol(): "sym"}
> ```
> 
> 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.
> 
> Alex
> 
> 
> On Wednesday, 28 October 2015, Herby Vojčík <[email protected] <>> wrote:
> 
> 
> Alexander Jones wrote:
> Ok, thanks for clarifying. Not only does it preserve order but it also
> permits non-string keys. You're still missing one detail which is that
> `bar` would actually be a variable not a string key.
> 
> Another example to clarify that the key part would be an expression:
> 
> ```
> Map#{foo(42) + 7: "bar"}
> ```
> 
> I prefer this over the precedent set by object literals which would
> require that [] are used around a key expression ("computed key") simply
> 
> I, on the other hand, think it should match object literals completely. So 
> your example would be
> 
> ```
> Map#{[foo(42)+7]: "bar"}
> ```
> 
> Yes, it's just for consistency and less WTF moment while learning the details.
> 
> OTOH, there could be consistent contraproposal of:
> 
> ```
> Object#{foo(42) + 7: "bar"}
> null#{foo(42) + 7: "bar"}
> #{foo(42) + 7: "bar"}
> ```
> 
> 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.
> 
> due to relieving the syntax noise, which is what this idea is all about.
> Also, this is how it works in Python and I make no apologies about the
> similarities ;)
> 
> Alex
> 
> On Wednesday, 28 October 2015, Viktor Kronvall
> <[email protected] <> <mailto:[email protected] <>>> wrote:
> 
>     Hello Alexander,
> 
>     I see now that I misread your desugaring.
> 
>     I read:
> 
>     ```
>     Map#{1: 6, bar: 'Hello', 2: 8};
>     ```
>     as being desugared to:
> 
>     ```
>     Map[Symbol.literalOf]({1: 6, bar: 'Hello', 2: 8}[Symbol.iterator]());
>     ```
> 
>     But your proposal clearly states that is should be:
> 
>     ```
>     Map[Symbol.literalOf]([[1, 6], ['bar', 'Hello'],
>     [2,8]][Symbol.iterator]());
>     ```
> 
>     Which would preserve lexical ordering of entries. The fault is
>     completely mine. Sorry.
> 
>     I like this proposal as it is extensible and not that noisy in
>     syntax. Using the `#` for this doesn't
>     seem like a bad idea either. People coming from Erlang will be
>     familiar with this as well.
> 
> 
>     2015-10-28 10:53 GMT+01:00 Alexander Jones <[email protected] <>
>     <javascript:_e(%7B%7D,'cvml','[email protected] <>');>>:
> 
>         Hi Victor
> 
>         Not sure I understand - the desugaring I wrote would absolutely
>         preserve the written ordering because it speaks in terms of an
>         ArrayIterator of key-value pairs. If the map type to which it's
>         applied chooses to forget the ordering then that's fine.
> 
>         Alex
> 
> 
>         On Wednesday, 28 October 2015, Viktor Kronvall
>         <[email protected] <>
>         <javascript:_e(%7B%7D,'cvml','[email protected] <>');>> wrote:
> 
>              > ```
>             >  const map = IMap#{"foo": 42, bar: 44};
>             >  ```
>              > It could desugar as, for the sake of example:
>              >
>              > ```
>              > Foo#{key: value, ...}
>              > ➔
>              > Foo[Symbol.literalOf]([[key, value], ...][Symbol.iterator]())
>              > ```
> 
>             I like this proposal. However, Maps should guarantee
>             insertion order when traversing the keys and values and
>             desugaring it like that does not respect this guarantee or
>             more precisely it will lead to (in my opinion) unexpected
>             order of the keys.
> 
>             ```
>             Object.keys({1: 6, bar: 'Hello', 2: 8}); // → [ '1', '2',
>             'bar' ]
>             ```
> 
>             If I'm not mistaken this will be same order for `{1: 6, bar:
>             'Hello', 2: 8}[Symbol.iterator]()`.
> 
>             This implies that:
> 
>             ```
>             Map#{1: 6, bar: 'Hello', 2: 8};
>             ```
> 
>             Will not have entries in the order `[[1, 6], ['bar',
>             'Hello'], [2,8]]` but instead `[[1,6], [2,8], ['bar','Hello']]`.
> 
>             This means that possible future destructuring of a Map will
>             be harder to reason about.
> 
> 
>             2015-10-28 2:21 GMT+01:00 Alexander Jones <[email protected] <>>:
> 
>                 True, but easy to mess up and only be treated to a
>                 runtime error. Three nested brackets at the start and
>                 end could definitely be better, and this just encourages
>                 people to use POJSOs instead. Also not a very uniform
>                 interface if you look at how to construct a Map, Set or
>                 Immutable.List at present, though admittedly constructor
>                 call for the ES6 types would be a partial improvement.
> 
>                 On Wednesday, 28 October 2015, Tab Atkins Jr.
>                 <[email protected] <>> wrote:
> 
>                     On Wed, Oct 28, 2015 at 8:36 AM, Alexander Jones
>                     <[email protected] <>> wrote:
>                      > I agree this is pretty important. Using actual
>                     maps really frees up a lot of
>                      > complexity, but the syntax is cumbersome to say
>                     the least.
>                      >
>                      > Whatever the decided syntax, bare words as string
>                     keys is a really bad idea
>                      > IMO. The key syntax should be parsed as an
>                     expression, like the values are,
>                      > and like they are in basically every other language.
>                      >
>                      > Another outstanding issue is that we might want
>                     the syntax for
>                      > `Immutable.Map`, or `WeakMap`, or `MapTwoPointOh`
>                     that improves deficiency
>                      > $x, $y and $z. I'd say introducing a special
>                     syntax for `Map` right now is
>                      > not ideal.
> 
>                     Currently, the "extensible literal syntax" for this
>                     isn't that bad:
> 
>                     const bar = 43;
>                     const map = Immutable.Map([["foo", 42], [bar, 44]]);
> 
>                     It's a little more verbose because the entries have
>                     to be surrounded
>                     by [], but hey.
> 
>                     ~TJ
> 
> 
>                 _______________________________________________
>                 es-discuss mailing list
>                 [email protected] <>
>                 https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>
> 
> 
> 
> _______________________________________________
> es-discuss mailing list
> [email protected] <>
> https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>
> _______________________________________________
> es-discuss mailing list
> [email protected] <mailto:[email protected]>
> https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>
> 
> _______________________________________________
> es-discuss mailing list
> [email protected] <mailto:[email protected]>
> https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>
> 
> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to