I know this is pointless bikeshedding, but that particular operator
conflicts with a current valid production.

```js
// These are synonymous, and are
// valid statements
tmp0 <- input.get('c')
tmp0 < (-input.get('c'))
```

On Wed, Aug 19, 2015, 09:53 Herby Vojčík <he...@mailbox.sk> wrote:

>
>
> Bergi wrote:
> > Samuel Hapák schrieb:
> >
> >> The main idea is, that if object defines `Symbol.get` method, it gets
> >> used to access properties of object instead of `[]` when destructuring.
> >
> > Aw, when I read "extensible destructuring" I had hoped to see an
> > extension to the destructuring syntax, not to see how semantics of
> > destructuring objects are changed.
> >
> > What do you think about extractor functions, like in Scala
> > <http://www.scala-lang.org/old/node/112>?
> > Instead of `unapply` or `unapplySeq` methods we'd probably use an
> > `@@extractor` (`Symbol.extractor`) method or so, allowing us to do
> >
> > let Map({a, b, c}) = myMap;
> >
> > let List(a, b, c) = myList;
> >
> > const Map({author: Map({name: {first, last}, birthdate})}) = book;
> >
> > which would desugar to
> >
> > let [{a, b, c}] = Map[Symbol.extractor](myMap);
> >
> > let [a, b, c] = List[Symbol.extractor](myList);
> >
> > const [{author: __author}] = Map[Symbol.extractor](book);
> > const [{name: {first, last}, birthdate}] =
> Map[Symbol.extractor](__author);
> >
> > where each extractor method would return an Iterable that is assigned to
> > the "arguments" of the extractor. (A Proxy to lazily destructure object
> > literals in there is a good idea, thanks @Claude).
> >
> > This would even allow us to call functions on destructuring, think about
> > module imports:
> >
> > // a.js
> > export default function factory(options) {
> > …
> > return moduleInstance;
> > }
> >
> > // b.js
> > const NoOptions = {
> > [Symbol.extractor](factory) { return [factory()]; }
> > };
> > const WithOptions = (...args) => ({
> > [Symbol.extractor](factory) { return [factory(...args)]; }
> > });
> >
> > import NoOptions(A) from "a";
> > import WithOptions("config")(A) from "a";
> > // A === moduleInstance
> >
> > What do you think about that?
>
> Nice, but as Samuel mentioned, you need to actually transform the data
> so it can be fed to stock destructurer.
>
> What I came up is the idea of "reified lvalue", the object that
> describes the (complex, destucturing) lvalue used for assignment (for
> example as the list of simple expression assignments, internally); and
> that such object could be transformed.
>
> Like (very rough examples; just an idea, not the spec):
>
>    let a = 4;
>
>    outer a <- input
>
>
>    let {a,c:{b}} = foo;
>
>    outer a <- input.a
>    tmp0 <- input.c
>    outer b <- tmp0.b
>
>
>    let {a,c:Map({b})} = foo;
>
>    Map[Symbol.lvalue] gets "outer b <- input.b" and transforms it to
> "outer b <- input.get('b')", so the result would be:
>
>    outer a <- input.a
>    tmp0 <- input.c
>    outer b <- tmp0.get('b')
>
>
>    let Map(a,c:Map({b})) = foo;
>
>    Map[Symbol.lvalue] get the above descriptor and transforms it to
>
>    outer a <- input.get('a')
>    tmp0 <- input.get('c')
>    outer b <- tmp.get('b')
>
> If things like Map[Symbol.lvalue] would be frozen (or just speculatively
> supposed not to be mutated), this can as well be done at compile time,
> so the resulting code could stay fast.
>
> > Bergi
>
> Herby
> _______________________________________________
> 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