Perhaps “very semantically different” was the wrong phrase. What I mean is simply that, as an author and a reader of code, impl means “definitions will be provided here,” while delegate means “aliases will be provided here,” and knowing in advance which I am looking at would, I think, simplify the reading process, and possibly the syntax. You are correct that there would be no difference in client code or calling convention, except possibly as an optimization if the trait implementation is known at compile time (i.e. no runtime dispatch) and the alias is available during inlining; in this case, presumably, the alias target could be invoked directly.
So my intent in using the word “semantic” was precisely to indicate a difference that doesn’t really matter in its de-sugared form, but may matter to the programmers working on the project.
That said, I don’t feel particularly strongly about this. Primarily, I wanted aliasing to go in its own block because I think it just looks a little cleaner and won’t require a change to the existing impl block syntax.
No, I do not have an alternate syntax in mind. I would prefer something that explicitly shows either the included members or the excluded members, a la this Bash-ism (I know, I know, it’s hideous):
delegate TR for S {
[* !(fn foo, fn bar)] = S.f.*;
}
… or even yet another contextual keyword:
delegate TR for S {
[* except fn foo, fn bar] = S.f.*;
}
…but I don’t have a strong rationale for this, I suppose, and I guess it’s okay if [*] means something like Ruby’s method_missing.
For static methods, I’m actually not sure what a delegate would be supposed do, assuming f is something like an instance variable.