On Wednesday, 30 January 2013 at 09:29:17 UTC, Dicebot wrote:
Case 1 (binary level, C + D):
----- sample.d -----
module sample;
private int func() { return 42; }
----------
----- oops.c -----
#include <stdio.h>
extern int _D6sample4funcFZi();
void* _Dmodule_ref = 0;
void* _D15TypeInfo_Struct6__vtblZ = 0;
void _Dmain() { }
int main()
{
long value = _D6sample4funcFZi();
printf("%ld\n", value);
return 0;
}
----------
----- shell -----
$ dmd - c sample.d
$ gcc -c oops.c
$ gcc oops.o sample.o
./a.out
42
----------
Are we really supporting C calling D functions? If we change the
function to extern(C) the compiler should probably error if it
private.
Case 2 (pure D, language level):
----- sample.d -----
module sample;
private struct Hest
{
int a, b;
}
public alias Hidden UseMe;
----------
----- oops.d -----
import sample;
import std.stdio;
void main()
{
UseMe tmp;
tmp.a = 42;
}
----------
I think there has been complaint that alias makes symbols public.
Though it can be nice to make template instances have nicer names.
Also a similar example:
Hest makeMe() { ... }
-------oops.d------
import sample;
void main() {
Hest tmp = makeMe();
int mine = tmp.a;
}
So thumbs up here
Case 3 (consistency):
I do insist on keeping class and module protection attribute
consistent. Saying class privates are always accessible from
other modules via tupleof & friends and module privates may be
not is causing confusion for no real gain. Also it may break
code if we have any means to enumerate module symbols via
traits (do we? I don't know).
I'm not sure what you said here. I assume you mean this should
work:
class Holder {
private int stuff;
}
------ Other module----
write("file", myHolder.serialize());