Inner modules / namespaces

Bruno Medeiros brunodomedeiros+spam at com.gmail
Mon Sep 17 02:51:08 PDT 2007


Bill Baxter wrote:
> Bruno Medeiros wrote:
>> Bill Baxter wrote:
>>> One thing I find I keep wishing D had was a way to make a distinct 
>>> namespace inside a file.  This would make it possible to group bits 
>>> of functionality into namespaces without having to break each one out 
>>> into a separate file.
>>>
>>> I think the most natural way to do this would be to allow inner 
>>> modules.  These modules would not be directly importable from outside 
>>> but would be accessible from outside if public.
>>>
>>> Basic example:
>>>
>>> ------
>>> private module Detail {
>>>    import std.stdio;
>>>    import std.string;
>>>    import std.regex;
>>> }
>>> ....
>>> Detail.writefln("hi there");
>>> ------
>>>
>>> This would basically be equivalent to making a separate file called 
>>> "Detail.d" whose contents are
>>>
>>>    public import std.stdio;
>>>    public import std.string;
>>>    public import std.regex;
>>>
>>> And then doing
>>>
>>>    static import Detail;
>>>
>>> In the original module.  Except you don't have to actually go through 
>>> the rigmarole of making a separate file.  *ALSO* Detail and the main 
>>> module would have same-module access to each others privates.
>>>
>>> The mutual access is the big thing.  You can make separate modules 
>>> now, but that's not so useful for implementing a private "Detail" 
>>> namespace that hides a bunch of non-public functionality behind one 
>>> name.  Yes, you can achieve similar results with a big private {...} 
>>> block but the difference is that you can't give that private block a 
>>> name.  By putting your private stuff in one namespace, it becomes 
>>> easier for readers of the code to figure out what's private 
>>> functionality and what's not.
>>>
>>> The other advantage is that it makes it easier to aggregate several 
>>> modules under a common namespace within a module.  For instance I 
>>> often wish I could do something like
>>>
>>> private module Util {
>>>    import std.string;
>>>    import my.utils;
>>>    import your.utils;
>>> }
>>>
>>> and get at all those Util things via one Util prefix.  Yes I can do 
>>> that by creating another module with public imports, but I never do, 
>>> because its a pain, and this particular combination of Util modules 
>>> is probably never going to be used anywhere besides this one module.  
>>> So it doesn't really make sense to create a world-visible module 
>>> that's basically useless aside from inside this one module.
>>>
>>> I'm planning to throw this up as an enhancement request on Bugzilla, 
>>> but I thought I'd put it out here first to see what the reaction is.
>>>
>>> --bb
>>
>> It would be a nice start (and useful just on itself) if imports were 
>> to work on scopes other than the module scope.
> 
> You mean like doing 'import std.stdio' inside a function or class?  That 
> would be nice, but I think it should be considered separately.  That's 
> more in the category of "workarounds for lack of 'using'" whereas this 
> is a workaround for lack of 'namespace'.
> 

Yeah, it's pretty much a separate issue.


-- 
Bruno Medeiros - MSc in CS/E student
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D



More information about the Digitalmars-d mailing list