Dependency management in D

Scott Wilson via Digitalmars-d digitalmars-d at puremagic.com
Fri Sep 19 10:38:20 PDT 2014


On Friday, 19 September 2014 at 02:05:43 UTC, ketmar via
Digitalmars-d wrote:
> On Fri, 19 Sep 2014 01:42:58 +0000
> Scott Wilson via Digitalmars-d <digitalmars-d at puremagic.com> 
> wrote:
>
>> Do .di files contain only templates (no comments and plain
>> functions? How well do they work? thanx
> as for 'how .di files work' question: '.di' is just a plain D 
> source,
> just with stripped function bodies. nothing very special about 
> that.
>
>
> so yes, .di files contains only templates and function 
> declarations
> (without function bodies). this *can* work, but when it comes 
> to CTFE...
>
> look at the following:
>
> === z00.d ===
>   module z00;
>   string foo(string name) { return `int `~name~`() {return 
> 42;}`; }
>
> === z01.d ===
>   import z00;
>   mixin(foo(`bar`));
>   void main () {
>     import std.stdio;
>     writeln(bar());
>   }
>
> and .di file generated with `dmd -H -c -o- z00.d`:
> === z00.di ===
>   // D import file generated from 'z00.d'
>   module z00;
>   string foo(string name);
>
>
> do you see any gotchas? heh:
> # dmd z01.d
> z01.d(2): Error: foo cannot be interpreted at compile time, 
> because it
> has no available source code
> z01.d(2): Error: argument to mixin must be a string, not 
> (foo("bar"))
> of type string
>
> the compiler has no source for foo() anymore, so it can't do 
> CTFE.
>
> you can avoid this by turning foo() into template:
>   string foo()(string name) { return `int `~name~`() {return 
> 42;}`; }
>
> but then you should turn all your functions that can be used in 
> CTFE
> into templates, and there will be no much sense in .di file 
> anyway.
>
>
> to make a long story short: don't use .di files unless you 
> *REALLY*
> *KNOW* what you're doing. and even then think twice.

That CTFE is used randomly everywhere? Otherwise I dont grok
whats so complicated. If I want visible code aka templates and
CTFE I put that in the .di. For separation I put declaration in
.di and impl in .d.

What subtleties Im missing?

Scott


More information about the Digitalmars-d mailing list