ADL

deadalnix via Digitalmars-d digitalmars-d at puremagic.com
Mon Sep 5 16:16:58 PDT 2016


On Monday, 5 September 2016 at 13:35:02 UTC, Andrei Alexandrescu 
wrote:
> On 9/5/16 11:43 AM, Timon Gehr wrote:
>> On 05.09.2016 06:05, Manu via Digitalmars-d wrote:
>>> An algorithm that calls a function on
>>> some T it receives just wants to look near the T; UFCS 
>>> functions will
>>> be there.
>>
>> I agree with your post except for this.
>>
>> In general there could be four modules: one defines the type, 
>> one
>> defines the UFCS function, one defines the generic algorithm, 
>> and the
>> last one imports the former three. The problem is that D has 
>> no standard
>> way to make them work together.
>
> Do you think there should? And if so, what would the algorithm 
> be? -- Andrei

I ran into that very problem many time, and I think it is 
legitimate.

Typical use case is a type from module A that is extended by 
module B to conform to whatever typeclass is desired (a range for 
instance) via UFCS. It is not possible to pass it down to 
anything generic expecting that typeclass is not passed down.

However, it is not clear what the solution should be. Tweaking 
the identifier resolution would make template instance dependent 
on the instantiation point, which is a non starter (it would 
cause an explosion is both resources required to compile and a 
huge amount a binary bloat).

On the other hand, I was wondering if it is possible to create a 
wrapper type type, with alias this, that is dependent on the 
scope, and that do UFCS resolution is that scope. One could then 
use the template like :

myalgorithm(forwardUFCS(var));

With var the vairable of the type extended to fit the typeclass. 
I suspect this can be done with a fair amount of mixin magic, but 
I'm not 100% sure.

This way, forwarding the instancier scope would only be done on 
demand, which would mitigate the instanciation explosion problem 
one face when doing it as identifier resolution level.


More information about the Digitalmars-d mailing list