On 08.01.2016 14:50, Walter Bright wrote:
On 1/8/2016 12:11 AM, Jacob Carlborg wrote:
Walter, should "ns.a()" work in the above example?
No:
1. first "ns.a" looks up "ns". Finds it in the current module, "main.ns".
2. Looks "a" up in "main.ns". "a" is not there. Error.
"a()" works because:
1. Look up "a" in current module. Doesn't find it.
2. Look up "a" in import "foo".
1. doesn't find it. Look in imported scope "foo.ns". finds it.
3. Look up "a" in import "bar".
1. doesn't find it. Look in imported scope "bar.ns". Doesn't find it.
Found only one "a" in the imports. We have da winnah!
I think name lookup rules are straightforward in D. I explain them over
and over, for years, and nobody but me understands them. I find it very
frustrating.
Just to clarify: namespaces don't apply "normal" symbol lookup rules (as
inside structs), but create a "named scope" according to the docs (a
term never used elsewhere). That means it behaves like a template mixin
with lookup rules very similar to imports.
Walter, maybe you can show how STL is supposed to be wrapped and used. I
tried this (using stl as package to avoid conflicts with std):
//////////////////////////////
module stl.map;
extern(C++,std)
struct map(K,V)
{
V[K] data;
}
//////////////////////////////
module stl.vector;
extern(C++,std)
struct vector(T)
{
T[] data;
}
//////////////////////////////
import stl.vector;
import stl.map;
//import std.stdio;
//import std.algorithm;
void main()
{
std.vector!int v;
std.map!(int,int) m;
// writeln(v);
}
This yields:
test.d(11): Error: stl.vector.std at stl\vector.d(3) conflicts with
stl.map.std at stl\map.d(3)
test.d(12): Error: stl.vector.std at stl\vector.d(3) conflicts with
stl.map.std at stl\map.d(3)
test.d(12): Error: template identifier 'map' is not a member of
namespace 'stl.vector.std'
It gets worse if you add D's std package into the mix by adding the
commented lines:
test.d(11): Error: template identifier 'vector' is not a member of
import 'test.std'
test.d(12): Error: template identifier 'map' is not a member of import
'test.std'
This works to disambiguate, but it is not nice (but maybe inevitable):
void main()
{
stl.vector.vector!int v;
stl.map.map!(int,int) m;
writeln(v);
}