On Wednesday, 13 March 2013 at 18:54:29 UTC, Maxim Fomin wrote:
From "Fully typed delegates": "Delegate's context is assumed to be of type void*. However, it can be specified as a type after the parameter list ".


Pointer already cast to void* so that isn't really new. ref are pointer behind the hood.

This is necessary as the context type is especially important for value types, not really for reference/pointers.

This does not look like the best idea: 1) context pointer may point to function frame with several different objects, 2) there are no evidences in th DIP about which problems are solved by ability to append explicit type of context pointer.


1) It is explained : context is a pointer to a tuple.
2) It does allow value type as context, which in return allow to unify many construct into delegates. It also solve the qualifier transitivity problem.

From " UFCS as delegates": example with function foo(ref uint a) raises concern about ABI implementation. Currently context pointer is passed through RDI and arguments are passed differently. There would be a problem with functions like foo() which do not know from where to take an argument - are they called directly or like a closure?


I don't think ABI should be part of D spec. Or should it ?

Anyway, I don't see any reason to have all kind of different ABI for function call, and this is a good opportunity to unify everything using the context as a regular, first argument.

Frankly, I see this simpler: delegate = function pointer + data pointer, so they should follow language rules (especially regarding qualifiers).


It is a tempting idea, but do not work. Consider :

void delegate() immutable a;
const void delegate() b = a;

This would be forbidden as covariance of function parameters and transitivity act in opposite directions.

Reply via email to