That's something no one here really thought of yet. I don't personally have
a lot of investment in this.

(@Alex and yes, much of that was based on your idea. It was a great
starting point.)

On Thu, Oct 29, 2015, 21:23 Alexander Jones <a...@weej.com> wrote:

> I don't think borrowing object notation is a good idea. What exactly does
>
> ```
> const myMap = Map#{
>     get foo() { return 100; },
>     set foo(v) {}
>     constructor() {}
> };
> ```
>
> mean?
>
> Honestly, a very significant portion of the use cases I have for *actual
> maps* don't involve string keys. So to borrow object notation and have to
> constantly write keys in [] is pretty naff:
>
> ```
> const describe = Dict#{
>     [1]: "one",
>     [[1, 2]]: "array of 1 and 2",
>     [null]: "the null value",
> }; // please no!
> ```
>
> If it makes people feel too weird to have comma separated, colon split
> key-value pairs within curlies that *don't* parse like POJSOs, we could
> have completely non-ambiguous parse with normal parentheses, I think?
>
> ```
> const describe = Dict#(
>     1: "one",
>     [1, 2]: "array of 1 and 2",
>     null: "the null value",
> );
> ```
>
> That might limit confusion while giving a syntactically clean way to
> define maps. Let's consider that a future mapping type like Dict compares
> non-primitive keys by abstract value instead of by reference identity.
> There are *tonnes* of nice use cases that open up that are taken for
> granted in other languages and other classes like Immutable.Map - we're not
> there yet with ES6 built-ins, so perhaps people might not yet appreciate
> the value of this.
>
> To reiterate a previous point, object property access with a statically
> defined string key is idiomatically written `obj.foo`, so it makes sense
> for symmetry to have `foo` appear as a bareword in a literal defining `obj
> = {foo: 42}`. For most mapping-type classes this symmetry simply does not
> apply, and frankly neither should it.
>
> Also, I specifically suggested that the consumed value is an ArrayIterator
> rather than an Array, because I feel having an intermediate Array around is
> placing too high an importance on the humble Array. If the implementation
> really wants an Array to work on internally, they can simply call
> `Array.from` with little cost. But if they want an Immutable.List they can
> have that instead without ever seeing an actual Array. (The Symbol.fromHash
> method is just Symbol.literalOf as I called it - same thing, modulo
> bikeshed.)
>
> Alex
>
>
> On 29 October 2015 at 22:51, Isiah Meadows <isiahmead...@gmail.com> wrote:
>
>> Why not make it desugar to a direct function call with a single array of
>> pairs? It's so parsed as a regular object, so shorthands can still be used.
>>
>> `Map#{foo: 1, bar: 2, 3: "baz"}`
>> `Map[Symbol.fromHash]([[foo", 1], ["bar", 2], ["3", "baz]])`
>>
>> `Object#{foo: 1, bar: 2, 3: "baz"}`
>> `Object[Symbol.fromHash]([[foo", 1], ["bar", 2], ["3", "baz]])`
>>
>> `Object.null#{foo: 1, bar: 2, 3: "baz"}`
>> `Object.null[Symbol.fromHash]([[foo", 1], ["bar", 2], ["3", "baz]])`
>>
>> (`bar` doesn't have [[Construct]])
>> `Object#{foo, bar() {}}`
>> `Object[Symbol.fromHash]([[foo", foo], ["bar", function () {}]])`
>>
>> And as for implementation, use this:
>>
>> ```js
>> extend class Map {
>>   static [Symbol.fromHash](pairs) {
>>     return new this(pairs);
>>   }
>> }
>>
>> // etc...
>>
>> function SetKeys(target, pairs) {
>>   for (const [key, value] of pairs) {
>>       target[key] = value
>>     }
>>     return target
>> }
>>
>> extend class Object {
>>   static [Symbol.fromHash](pairs) {
>>     return SetKeys({}, pairs)
>>   }
>>
>>   static null(pairs) {
>>     return SetKeys(Object.create(null), pairs)
>>   }
>> }
>> ```
>>
>> Pretty simple IMHO. A helper decorator could even be made.
>>
>> On Wed, Oct 28, 2015, 14:34 Alexander Jones <a...@weej.com> wrote:
>>
>>> Also I would like to reiterate that errors in the shape of the N-by-2
>>> array are only caught at runtime. That's really not ideal.
>>>
>>> On Wednesday, 28 October 2015, Dave Porter <david_por...@apple.com>
>>> wrote:
>>>
>>>> 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 <michalwa...@gmail.com>
>>>> 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 <m...@azimi.me>:
>>>>
>>>>> 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 <a...@weej.com> 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 <a...@weej.com> 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 <he...@mailbox.sk>
>>>>>>> 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
>>>>>>>>> <viktor.kronv...@gmail.com <mailto: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
>>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>> 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
>>>>>
>>>>>
>>>> _______________________________________________
>>>> 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
>>>
>>
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to