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 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 <viktor.kronv...@gmail.com> 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 <a...@weej.com > <javascript:_e(%7B%7D,'cvml','a...@weej.com');>>: > >> 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 <viktor.kronv...@gmail.com >> <javascript:_e(%7B%7D,'cvml','viktor.kronv...@gmail.com');>> 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 <a...@weej.com>: >>> >>>> 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. <jackalm...@gmail.com> >>>> wrote: >>>> >>>>> On Wed, Oct 28, 2015 at 8:36 AM, Alexander Jones <a...@weej.com> >>>>> 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 >>>> es-discuss@mozilla.org >>>> https://mail.mozilla.org/listinfo/es-discuss >>>> >>>> >>> >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss