Writing closed source programs in D?

Maxim Fomin maxim at maxim-fomin.ru
Mon Jun 3 11:53:22 PDT 2013


On Friday, 31 May 2013 at 15:35:54 UTC, Jonathan M Davis wrote:
> The situation with templates is basically the same as it is 
> with C++. They
> have to go in the interface/header file and always will. 
> There's no way around
> that, because the code importing the header/interface file 
> actually needs the
> full definition. If the compiler supported some sort of 
> intermediate format,
> then you could provide partially compiled templates, but pretty 
> much all of
> the information would still have to be there (just in a less 
> human readable
> format), and you can't even partially compile much of a 
> template without the
> arguments to instantiate it with anyway. So, you'd pretty much 
> just be putting
> the same template definition in a binary format instead of 
> text, which wouldn't
> stop much of anyone from figuring out what they looked like.
>
> - Jonathan M Davis

Actually dmd for code importing module doesn't need full 
definition, it only inserts symbols referring to external object 
files. This allows to split template declaration and definition 
with restriction that module with template definition emits 
referred symbols (which restricts applicability since due to 
separate compilation model it is impossible to know beforehand 
template parameters). This also can be viewed as 'linker' 
template constraint, if you pass not expected parameters you will 
have link error.

import foo;
import std.stdio;

class Me : BiiA
{
    override void foo()
    {
       writeln("main");
    }
}


void main()
{
    BiiA b = new Me;
    b.foo();
    b.get();
}
--- foo.di-------
template bar(T, U)
{
    U baz();
    class A(T)
    {
       T t;
       T get();
       void foo();
    }
}

alias bar!(int, int) Bii;
alias Bii.A!int BiiA;
---foo.d ----
import std.stdio;

template bar(T, U)
{
    U baz();
    class A(T)
    {
       T t;
       T get()
       {
          writeln("foo");
          return t;
       }
       void foo()
       {
          writeln("foo");
       }
    }
}

alias bar!(int, int) Bii;
alias Bii.A!int BiiA;
-----
dmd main.d // Error undefined reference to ...
dmd main.d foo.o //works
./main
main
foo


More information about the Digitalmars-d-learn mailing list