I was actually talking about the syntax itself. I'd be fine with less
verbose, extensible Map semantics.

On Sun, Nov 29, 2015, 12:14 Alexander Jones <a...@weej.com> wrote:

> I think you're overlooking the parse-time shape checking, Isiah, which in
> the new world order of type inference and checking seems like a necessity
> to me.
>
> While I fully appreciate that Tab's solution involves the least number of
> specification additions, I still would rather write this without the extra
> pair of parens and the `new` which was omitted, just to cut down on the
> noise and really reduce the number of reasons people have to use `Object`
> instead of a more suitable type. Consider embedding lists as keys in a map
> which compares keys by value:
>
> ```
> let m =  new Dict(#(1: "one", new List(#(1, 2)): "array of 1 and 2", null:
> "the null value"));
> ```
>
> I think this just starts to look quite gnarly, and the fewer occurrences
> of `new` I see in declarative code the better.
>
> Re-consider my offered alternative, (putting `#{}` and `#[]` back on the
> table to visually distinguish abstract list and abstract mapping):
>
> ```
> let m =  Dict#{1: "one", List#[1, 2]: "array of 1 and 2", null: "the null
> value"};
>
> let platonics = Set#["tetrahedron", "cube", "octahedron", "dodecahedron",
> "icosahedron"];
> ```
>
> I think it would also make sense to allow `...` to include the results of
> iteration over some other iterable.
>
> ```
> let nums = [2, 3, 4];
> let setOfNums = Set#[1, 2, 3, ...nums, ...range(20, 50)];
> ```
>
> Cheers
>
>
> On Sunday, 29 November 2015, Isiah Meadows <isiahmead...@gmail.com> wrote:
>
>> With that syntax, I'm not even sure it's necessary. It's not much more
>> concise than a list of 2-tuples. Don't quite see the benefit the other than
>> a few characters.
>>
>> On Sat, Nov 28, 2015, 22:22 Tab Atkins Jr. <jackalm...@gmail.com> wrote:
>>
>>> On Thu, Oct 29, 2015 at 6:23 PM, 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.)
>>>
>>> I strongly agree with a lot of the points here, and think they suggest
>>> the OP's suggestion was generalized in slightly the wrong way.
>>> Producing a Map literal is indeed too specific to justify syntax, but
>>> what's suggested is not a special way of calling some constructors,
>>> but *a literal syntax for 2-value iterators*.
>>>
>>> We have a literal syntax for 1-value iterators: just use an Array.
>>> It's lightweight (2 chars + 1 char per item), and typos in the syntax
>>> are caught at compile time.  Our existing literal syntax for 2-value
>>> iterators (an array of length-2 arrays) fails at both of these: it's
>>> heavyweight (4 chars + 4 chars per item), and typos in the syntax are
>>> only caught at runtime, when it's actually iterated over.
>>>
>>> Having a lightweight, compile-time-checked 2-value iterator literal
>>> that desugars to an N×2 Array (or ArrayIterator) fixes all these
>>> problems, and makes it easy to write Map literals, Immutable.Dict
>>> literals, or anything else.  Using the hash-paren syntax suggested
>>> above:
>>>
>>> ```
>>> let m =  Map(#(1: "one", [1, 2]: "array of 1 and 2", null: "the null
>>> value"));
>>> ```
>>>
>>> There's no need to invent a new function-calling syntax or add a new
>>> well-known symbol to anything. It Just Works™ as long as the function
>>> you pass it to expects a 2-value iterator.
>>>
>>> (From other languages, there doesn't appear to be any call for N×3
>>> literals or anything higher
>>>
>>> ~TJ
>>>
>>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to