Lazy evaluation
Andrea Giammarchi
andrea.giammarchi at gmail.com
Thu Aug 31 16:23:15 UTC 2017
right ... so ... I'm not sure I understand what this proposal would solve.
Instead of this:
```js
obj.val || (obj.val = getValue())
```
you want to do this
```js
(obj.val || (obj.val = new Lazy(getValue)).get();
```
Where is the "win" and why is that?
On Thu, Aug 31, 2017 at 5:18 PM, Isiah Meadows <isiahmeadows at gmail.com>
wrote:
> With my proposed `Lazy` class, if you were to use an instance as a
> descriptor, the `this` value it'd receive would not be a `Lazy`
> instance like it'd expect.
>
> Consider it the difference between `a.self` and `b.get()` in your
> example. `b.get()` is what I'd be expecting.
> -----
>
> Isiah Meadows
> me at isiahmeadows.com
>
> Looking for web consulting? Or a new website?
> Send me an email and we can get started.
> www.isiahmeadows.com
>
>
> On Thu, Aug 31, 2017 at 12:12 PM, Andrea Giammarchi
> <andrea.giammarchi at gmail.com> wrote:
> >> using it in a descriptor would get it passed the wrong `this`
> >
> > sorry, what?
> >
> > ```js
> > var a = {};
> > var b = {get() { return this; }};
> > Object.defineProperty(a, 'self', b);
> >
> > a.self === a; // true
> > ```
> >
> >
> > On Thu, Aug 31, 2017 at 5:09 PM, Isiah Meadows <isiahmeadows at gmail.com>
> > wrote:
> >>
> >> No. `Lazy` is intended to be an object to be used directly, not a
> >> descriptor of any kind.
> >>
> >> (My `lazy.get()` is an unbound method, so using it in a descriptor
> >> would get it passed the wrong `this`.)
> >> -----
> >>
> >> Isiah Meadows
> >> me at isiahmeadows.com
> >>
> >> Looking for web consulting? Or a new website?
> >> Send me an email and we can get started.
> >> www.isiahmeadows.com
> >>
> >>
> >> On Thu, Aug 31, 2017 at 9:39 AM, Andrea Giammarchi
> >> <andrea.giammarchi at gmail.com> wrote:
> >> > the following is how I usually consider lazy values
> >> >
> >> > ```js
> >> > class Any {
> >> > _lazy(name) {
> >> > switch (name) {
> >> > case 'uid': return Math.random();
> >> > // others ... eventually
> >> > }
> >> > }
> >> > get uid() {
> >> > var value = this._lazy('uid');
> >> > // from now on, direct access
> >> > Object.defineProperty(this, 'uid', {value});
> >> > return value;
> >> > }
> >> > }
> >> >
> >> > const a = new Any;
> >> > a.uid === a.uid; // true
> >> > ```
> >> >
> >> > If I understand correctly your proposal is to use Lazy as generic
> >> > descriptor, is that correct ?
> >> >
> >> > ```js
> >> > Object.defineProperty({}, 'something', new Lazy(function (val) {
> >> > return this.shakaLaka ? val : 'no shakaLaka';
> >> > }));
> >> > ```
> >> >
> >> > ???
> >> >
> >> > If that's the case I see already people confused by arrow function
> >> > in case they need to access the context,
> >> > plus no property access optimization once resolved.
> >> >
> >> > It's also not clear if such property can be set again later on (right
> >> > now it
> >> > cannot)
> >> > 'cause lazy definition doesn't always necessarily mean inability to
> >> > reassign.
> >> >
> >> > What am I missing/misunderstanding?
> >> >
> >> > Regards
> >> >
> >> >
> >> >
> >> > On Thu, Aug 31, 2017 at 2:21 PM, Isiah Meadows <
> isiahmeadows at gmail.com>
> >> > wrote:
> >> >>
> >> >> It'd be really nice if lazy values made it into the spec somehow.
> I've
> >> >> already found myself using things like this [1] quite a bit, and I've
> >> >> also found myself frequently initializing properties not on first
> >> >> access.
> >> >>
> >> >> [1]:
> >> >> https://gist.github.com/isiahmeadows/4c0723bdfa555a1c2cb01341b323c3
> d4
> >> >>
> >> >> As for what would be a nice API, maybe something like one of these?
> >> >>
> >> >> ```js
> >> >> class Lazy<T> {
> >> >> constructor(init: () => T);
> >> >> get(): T; // or error thrown
> >> >> }
> >> >>
> >> >> function lazy<T>(init: () => T): () => T; // or error thrown
> >> >>
> >> >> function lazy<T>(init: () => T): {
> >> >> get(): T; // or error thrown
> >> >> }
> >> >> ```
> >> >>
> >> >> Alternatively, syntax might work, with `do` expression semantics:
> >> >>
> >> >> ```js
> >> >> const x = lazy do { ... }
> >> >> // expose via `x.get()` or just `x()`
> >> >> ```
> >> >>
> >> >> -----
> >> >>
> >> >> Isiah Meadows
> >> >> me at isiahmeadows.com
> >> >>
> >> >> Looking for web consulting? Or a new website?
> >> >> Send me an email and we can get started.
> >> >> www.isiahmeadows.com
> >> >> _______________________________________________
> >> >> es-discuss mailing list
> >> >> es-discuss at mozilla.org
> >> >> https://mail.mozilla.org/listinfo/es-discuss
> >> >
> >> >
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20170831/b64e2105/attachment.html>
More information about the es-discuss
mailing list