private mixin function

Chris Nicholson-Sauls ibisbasenji at gmail.com
Wed Apr 12 09:44:56 PDT 2006


Regan Heath wrote:
> On Tue, 11 Apr 2006 16:03:36 -0400, Jarrett Billingsley  
> <kb3ctd2 at yahoo.com> wrote:
> 
>> "Frank Benoit" <benoit__ at __tionex.de> wrote in message
>> news:e1gh7m$2btt$1 at digitaldaemon.com...
>>
>>> Never mind. Calling it with
>>> m1.func();
>>> works.
>>
>>
>> Hahaha, it's two bugs canceling each other out (maybe).
> 
> 
> I have a feeling it's related. I think mixins have some problems which  
> should be addressed, or at the very least cleared up in the docs. Let 
> me  elaborate... :)
> 
> In this case a 'MixinIdentifier' has been given 'm1':
> 
> mixin m!(byte) m1;
> 
> The docs say: "If a mixin has a MixinIdentifier, it can be used to  
> disambiguate" which, isn't exactly what we're using it for, but it does  
> seem to solve the problem. Then again, maybe this is the same bug as 
> you  mention where a private member in another module can be accessed 
> with it's  full name.
> 
> I think part of the problem is that "A mixin has its own scope ...", 
> this  was taken a little out of context, see:
>   http://www.digitalmars.com/d/mixin.html
> 
> It suggests to me that mixin has a scope (especially when you give it 
> an  identifier like 'm1'). If it has a scope, and that scope is m1, then 
> it  makes sense that need to call the function with m1.func();
> 
> That said, earlier in the docs it says "The declarations in a mixin are  
> 'imported' into the surrounding scope" and "It is analogous to cutting 
> and  pasting the body of the template into the location of the mixin", 
> if those  statements were true then this code should work:
> 
> template m(T){
>     private void func() {}
> }
> 
> class C{
>     mixin m!(byte);
>     
>     public this(){
>         func(); // error: func is private
>     }
> }
> 
> (note, no identifier) but it doesn't. It gives the same error as you 
> had  before. As there is no mixin identifier there is no solution here.
> 
> I've had this exact problem with them in the past, trying to mix 
> private  declarations into a class just plain doesn't work. Instead it 
> results in  something akin to a derived class, where the base had 
> private members.  They're just plain inaccessable, as you've found.
> 
> I would love to see this cleaned up.
> 
> Regan

This might seem crazy, but bear with me.  It looks to me like the function is declared as 
private In-Terms-Of the mixin, rather than the instantiating class, therefore maybe the 
solution would be to be able to do this:

# template m (T) {
#   void func () {}
# }
#
# class C {
#   private mixin m!(byte);
#
#   public this () {
#     func();
#   }
# }

Note that the 'private' attribute is moved out of the template, and instead applied to the 
mixin statement itself.  I suppose the meaning ought to be something similar to the 
meaning of public/protected/private in inheritance (iow, similar to the way "class Foo : 
private Bar" would behave).

-- Chris Nicholson-Sauls



More information about the Digitalmars-d-learn mailing list