Is there any hope for "lazy" and @nogc?

Shachar Shemesh shachar at weka.io
Wed Aug 1 16:52:21 UTC 2018


On 01/08/18 17:13, Steven Schveighoffer wrote:
> On 8/1/18 3:59 AM, Shachar Shemesh wrote:
>> Thank you! Finally!
>>
>> Let me just state, for the record, that having *yet another* syntax 
>> special case is just appalling.
> 
> The lazy variadic thing is a distinction between specifying variadic 
> lazy parameters and a lazy variadic array. The distinction is so 
> miniscule, but necessary to have a disambiguous syntax.
> 
> But I had actually thought for a while, that you could simply specify a 
> delegate, and it would be treated as a lazy parameter, which would 
> probably solve your problem. I really think this syntax should be 
> available.
> 
>> With that said, I was hoping that specifying it explicitly as a 
>> delegate would allow me to scope it. Apparently, that doesn't work :-(
>>
> 
> I guess you mean you can't scope the delegates? I'm surprised if that 
> doesn't work.
> 
> -Steve



import std.string;

alias Dg = string delegate() @nogc nothrow;

void myAssert(bool cond, scope Dg[1] msg_dg ...) @nogc nothrow
{
     import core.stdc.stdio;
     if (!cond)
     {
         string msg = msg_dg[0]();
         printf("%*s\n", msg.length, msg.ptr);
     }
}

void main() @nogc {
     string msg = "Hello";
     myAssert(true, msg); // <- errors on this line
}

It errors out: complains it needs to allocate main's frame on the GC, 
but main is @nogc. The same happens if I move the scope to the alias.


More information about the Digitalmars-d mailing list