Anonymous nogc class

Biotronic via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Sep 7 23:37:54 PDT 2017


On Thursday, 7 September 2017 at 23:40:11 UTC, Jiyan wrote:
> Hey,
> wanted to know whether it is possible to make anonymous nogc 
> classes:
>
> interface I
> {
> 	public void ap();
> }
> void exec(I i)
> {
> 	i.ap;
> }
>
> // now execute, but with something like `scope`
> exec( new  class  I
> {
> 	int tr = 43;
> 	override void ap(){tr.writeln;}
> });
>
> Thanks :)

Sadly, even std.typecons.scoped isn't currently @nogc:
https://issues.dlang.org/show_bug.cgi?id=13972
https://issues.dlang.org/show_bug.cgi?id=17592

This can be worked around by casting scoped's destructor to be 
@nogc, but that's a heavy-handed approach that ruins type safety, 
and is the wrong solution in non- at nogc situations. Should you 
want to, this is what it should look like:

         ~this()
         {
             (cast(void delegate(T) @nogc)((T t){
                 // `destroy` will also write .init but we have no 
functions in druntime
                 // for deterministic finalization and memory 
releasing for now.
                 .destroy(t);
             }))(Scoped_payload);
         }

If and when this issue is resolved, this should work:

interface I {
     public void ap();
}

void exec(I i) {
     i.ap;
}

auto scopedAnon(T)(lazy T dummy) if (is(T == class)) {
     import std.typecons;
     return scoped!T();
}

unittest {
     auto i = scopedAnon(new class I {
         int tr = 43;
         override void ap() {
             import std.stdio;
             tr.writeln;
         }
     });
     exec(i);
}

--
   Biotronic


More information about the Digitalmars-d-learn mailing list