On 10/17/2018 12:32 AM, aliak wrote:
Hi,

Is there any notion of lazy vars in D (i see that there're parameters)?

i.e:

struct S {
   //...
   int y;
   //...
}

lazy S x = () {
     // do some heavy stuff
}();

if (condition) {
   func(x.y); // heavy stuff evaluated here
}

Cheers,
- Ali





Not very clean but something like this:

import std.stdio;

struct LazyVar(alias exp) {
    alias T = typeof(exp());
    T value() {
        static bool initialized = false;
        static T val;

        if (!initialized) {
            val = exp();
            initialized = true;
        }
        return val;
    }

    alias value this;
}

LazyVar!(() {
    writeln("Doing heavy stuff");
    return 42;
}) a;

void main() {
    auto b = a.value;    // Must specify .value or
    int c = a;           // must specify type of value (int).
                         // Otherwise, b and c have type LazyVar!(...)

    // Some more usage
    b = c = a;

    assert(b == 42);
    assert(c == 42);
}

Ali

Reply via email to