Rant after trying Rust a bit
Walter Bright via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jul 23 13:52:46 PDT 2015
On 7/23/2015 1:08 PM, Dicebot wrote:
> I am not sure how it applies.
D interfaces (defined with the 'interface' keyword) are simple dispatch types,
they don't require an Object. Such interfaces can also have default implementations.
> My point was about the fact that `isInputRange`
> and `InputRangeObject` are the same entities in Rust, simply interpreted
> differently by compiler depending on usage context.
I understand.
> This is important because you normally want to design your application in terms
> of template constraints and structs to get most out of inlining and
> optimization. However, to define stable ABI for shared libraries, the very same
> interfaces need to be wrapped in runtime polymorphism.
>
> Closest thing in D would be to define traits as interfaces and use code like
this:
>
> void foo(T)()
> if ( (is(T == struct) || is(T == class))
> && Matches!(T, Interface)
> )
> { }
>
> where `Matches` is a template helper that statically iterates method list of
> interface and looks for matching methods in T.
I don't think the test for struct and class is necessary. It can be just:
void foo(T)() if (Matches!(T, Interface)) { ... }
as opposed to:
void foo(T : Interface)() { ... }
> However, making it built-in feels
> really convenient in Rust:
>
> - considerably less function declaration visual noise
It's less noise, sure, and perhaps we can do some syntactical sugar to improve
that. But I don't think this is a fundamental shortcoming for D as it stands now
(although nobody has written a Matches template, perhaps that should be a priority).
> - much better error messages: trying to use methods of T not defined by a trait
> will result in compile-time error even without instantiating the template
The error messages will occur at compile time and will be the same if you write
a unit test to instantiate the template. As I wrote earlier, I don't really
understand the need to ship template source code that has never been instantiated.
More information about the Digitalmars-d
mailing list