On Thursday, 31 October 2019 at 03:56:56 UTC, lili wrote:
Hi:
   why writeln need GC?

I cannot answer why it needs GC but something can be implemented like:

import core.stdc.stdio;

struct Point {
    int x;
    int y;
}

class Person {
    string name;
    uint age;
}

template GenStructMemberPrint(string structInstanceName, string memberName){ const char[] GenStructMemberPrint = "printf(\"%d\", " ~structInstanceName ~ "." ~ memberName ~ ");"; // static ifs can be used to use proper formats depending on the typeof struct member
}

// entire thing can be implemented using sprintf to obtain a nice formatted line
void writeln2(A...)(A arguments) @nogc nothrow {
    foreach (a; arguments) {
static if (is(typeof(a) == class) || is(typeof(a) == interface)) {
            printf("%s \n", typeof(a).stringof.ptr);
        } else
            static if (is(typeof(a) == string)) {
            printf("%s \n", a.ptr);
        } else
        static if (is(typeof(a) == struct)){
            foreach (member; __traits(allMembers, typeof(a))) {
                //writeln(member);
mixin(GenStructMemberPrint!(a.stringof, member)); // this needs some improvements to imitate writeln
            }
        }
        else {
            static assert( "non-supported type!");
        }
    }

}

void main()
{
    auto pt = Point(10, 20);
auto per = new Person(); // nogc custom allocator can be used here
        
    writeln2("ssss", per, pt);
}


Reply via email to