bearophile wrote:
Some comments are patently false (such as the one that you must compile with dmc 
to call C functions on Windows).<

Is this true? I have seen many times people here answer that code has to be 
compiled with DMC, etc. If I am wrong I'll fix the text.

I thought this was pretty much true for DMD-compiled code, unless either function is in a DLL or some kind of object file converter is used. (Or an ancient non-DMC C compiler that still produces OMF, I suppose)

Those are a lot of conditions, of course :P.

Some are ignorant (the author concluded that dmd can't optimize tail recursion by 
trying it with the non-tail-recursive factorial function; and I took the time to 
explain him!).<

If I compile this D2 program with DMD:

import std.stdio: printf;
import std.conv: to;

int sum(int[] a, int start=0) {
    if (start >= a.length)
        return 0;
    else {
        return a[start] + sum(a, start+1);
        //auto b = a[start];
        //return b + sum(a, start+1);
    }
}

void main(char[][] args) {
    int n = args.length > 1 ? to!int(args[1]) : 1;
    auto a = new int[n];
    foreach(i, ref x; a)
        x = i;
    printf("%d\n", sum(a));
}


This is the cleaned up code I obtain:

[snip code with recursive call instead of loop]


LDC is almost able to turn that tail-call into a loop (you have to split the 
final expression in two parts, I don't know if in the meantime such limit has 
being lifed), and GCC is able to.

He's right though; the code isn't properly tail recursive (it performs an add after the recursion). However, it can be *made* tail recursive by introducing an accumulator, which is something LLVM does here[1].


[1]: It currently does not realize the array load can be done before the function call, but I submitted a patch to LLVM for that. (This is why it currently needs to be split up, so that LDC emits the load before the function call)

Reply via email to