Bug in D!!!
Moritz Maxeiner via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Sep 2 14:19:31 PDT 2017
On Saturday, 2 September 2017 at 00:00:43 UTC, EntangledQuanta
wrote:
> On Friday, 1 September 2017 at 23:25:04 UTC, Jesse Phillips
> wrote:
>> I've love being able to inherit and override generic functions
>> in C#. Unfortunately C# doesn't use templates and I hit so
>> many other issues where Generics just suck.
>>
>> I don't think it is appropriate to dismiss the need for the
>> compiler to generate a virtual function for every instantiated
>> T, after all, the compiler can't know you have a finite known
>> set of T unless you tell it.
>>
>> But lets assume we've told the compiler that it is compiling
>> all the source code and it does not need to compile for future
>> linking.
>>
>> First the compiler will need to make sure all virtual
>> functions can be generated for the derived classes. In this
>> case the compiler must note the template function and validate
>> all derived classes include it. That was easy.
>>
>> Next up each instantiation of the function needs a new v-table
>> entry in all derived classes. Current compiler implementation
>> will compile each module independently of each other; so this
>> feature could be specified to work within the same module or
>> new semantics can be written up of how the compiler modifies
>> already compiled modules and those which reference the
>> compiled modules (the object sizes would be changing due to
>> the v-table modifications)
>>
>> With those three simple changes to the language I think that
>> this feature will work for every T.
>
> Specifying that there will be no further linkage is the same as
> making T finite. T must be finite.
>
> C# uses generics/IR/CLR so it can do things at run time that is
> effectively compile time for D.
>
> By simply extending the grammar slightly in an intuitive way,
> we can get the explicit finite case, which is easy:
>
> foo(T in [A,B,C])()
>
> and possibly for your case
>
> foo(T in <module>)() would work
>
> or
>
> foo(T in <program>)()
>
> the `in` keyword makes sense here and is not used nor
> ambiguous, I believe.
While I agree that `in` does make sense for the semantics
involved, it is already used to do a failable key lookup (return
pointer to value or null if not present) into an associative
array [1] and input contracts. It wouldn't be ambiguous AFAICT,
but having a keyword mean three different things depending on
context would make the language even more complex (to read).
W.r.t. to the idea in general: I think something like that could
be valuable to have in the language, but since this essentially
amounts to syntactic sugar (AFAICT), but I'm not (yet) convinced
that with `static foreach` being included it's worth the cost.
[1] https://dlang.org/spec/expression.html#InExpression
More information about the Digitalmars-d-learn
mailing list