Lazy evaluation

Andrea Giammarchi andrea.giammarchi at gmail.com
Thu Aug 31 16:12:16 UTC 2017


> 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/
> 4c0723bdfa555a1c2cb01341b323c3d4
> >>
> >> 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/9a6e2dfe/attachment.html>


More information about the es-discuss mailing list