lazy variables

aliak something at something.com
Thu Oct 18 16:21:25 UTC 2018


On Thursday, 18 October 2018 at 16:10:04 UTC, aliak wrote:
> On Thursday, 18 October 2018 at 14:16:56 UTC, Simen Kjærås 
> wrote:
>> On Wednesday, 17 October 2018 at 07:32:37 UTC, aliak wrote:
>>> Hi,
>>>
>>> Is there any notion of lazy vars in D (i see that there're 
>>> parameters)?
>>
>> What the language doesn't provide, it generally provides the 
>> tools to make:
>>
>> struct Lazy(T) {
>>     T delegate() _payload;
>>     this(lazy T t) {
>>         _payload = () => t;
>>     }
>>     T get() {
>>         return _payload();
>>     }
>>     alias get this;
>> }
>>
>> int fun() {
>>     n++;
>>     return 2;
>> }
>>
>> int n;
>>
>> unittest {
>>     Lazy!int a = 1 + fun();
>>     assert(n == 0); // Ensure fun hasn't been called.
>>     auto b = a + 2;
>>     assert(b == 5); // Ensure calculation is correct.
>>     assert(n == 1); // Ensure fun has been called.
>> }
>>
>> --
>>   Simen
>
> yes! perfect! Thank you

With single eval:

struct Lazy(T) {
     private T delegate() _payload;
     private T _value;
     private bool set = false;
     this(lazy T t) {
         _payload = () {
             writeln("evaled");
             return t;
         };
     }
     @property T value() {
         if (!set)
             _value = _payload();
         set = true;
         return _value;
     }

     @property void value(T newValue) {
         if (!set)
             _value = _payload();
         set = true;
         _value = newValue;
     }

     alias value this;
}


More information about the Digitalmars-d-learn mailing list