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 <[email protected]>
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