Final makes no difference?
    BCS 
    BCS at pathlink.com
       
    Thu Aug 24 13:28:26 PDT 2006
    
    
  
Chris Nicholson-Sauls wrote:
> BCS wrote:
[...]
>> interface Foo {
>>     char fig(int);
>>     int bar(char);
>> }
>> void fun()
>> {
>>     char[] cmap;    int[] imap;
 >>
>>     char first(int i){return cmap[i];}
>>     int second(char c){return imap[c];}
>>
>>     Foo f = interface : Foo {   // making up a syntax...
>>             alias first fig;
>>             alias second bar;
>>         }
>>     FnTakingFoo(f);
>> }
Neat work-around!
It does have the problem of double indirection in there:
f.classContex.functionContext[offset_s]
vs.
f.functionContext[offset_s]
But that's not that bad an issue.
Having the alias trick fail is more of an issue, but still not a big 
one. (BTW I expect this fails because the aliased function ends up being 
static or some such problem)
Also it is still a workaround that subverts something into something 
else it wasn't intended for.
My main question why that syntax even works? Shouldn't there be a ":" 
between the "class" and the "Foo"?
> 
> 
> Tested with DMD 0.165, no errors, runs perfectly:
> 
> # module funcface0;
> #
> # import std .stdio ;
> #
> # interface Foo {
> #   char[] str () ;
> #   int    num () ;
> # }
> #
> # void bar (Foo f) {
> #   writefln("str('%s')  num(%d)", f.str(), f.num());
> # }
> #
> # void func (char[] s, int n) {
> #   Foo f = new class Foo {
> #     char[] str () { return s ; }
> #     int    num () { return n ; }
> #   };
> #   bar(f);
> # }
> #
> # void main () {
> #   func("The answer is", 42);
> # }
> 
> I did try your trick of aliasing nested functions into the anonymous 
> class' scope... Unfortunatley it didn't work; DMD complained the 
> interface was left unimplemented.  Not a really big deal, as anonymous 
> classes apparently get access to the frame they were created in, the 
> same as a delegate does I'd imagine.
> 
> -- Chris Nicholson-Sauls
    
    
More information about the Digitalmars-d-bugs
mailing list