Calling dynamically bound functions from weakly pure function

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jul 19 04:11:59 PDT 2014


On Friday, 18 July 2014 at 16:19:20 UTC, John Colvin wrote:
> On Friday, 18 July 2014 at 16:12:18 UTC, Rene Zwanenburg wrote:
>> On Friday, 18 July 2014 at 15:57:40 UTC, John Colvin wrote:
>>> On Friday, 18 July 2014 at 14:15:46 UTC, Rene Zwanenburg 
>>> wrote:
>>>> For all intents and purposes, the following code can be 
>>>> weakly pure:
>>>>
>>>> struct VAO
>>>> {
>>>>
>>>> }
>>>
>>> urrmm. Did you mean to post more than that?
>>
>> Haha yup. Not sure what happened there.
>>
>> I'm a bit short on time at the moment, but what it comes down 
>> to is that Derelict loads functions from DLL's and assigns 
>> them to global function pointers. Of course, these function 
>> pointers have to be mutable.
>>
>> Is there a nice way to call such functions from a pure 
>> function?
>
> I haven't tried it, but can you cast the function references to 
> be pure?

Casting to pure would break purity if the called function is not 
actually pure. AFAIU, the problem is that the mutable function 
pointers are not accessible from inside the pure function at all, 
in which case the solution is to cast them to immutable, not to 
pure.

But to cast something, you'd need to have access to it in the 
first place...

This seems to work:

     int function(int) pure my_func_ptr;

     struct CallImmutable {
         static opDispatch(string fn, Args...)(Args args) {
             return mixin(fn)(args);
         }
     }

     int test() pure {
         return CallImmutable.my_func_ptr(1);
     }

But I suspect it's because of a bug. `CallImmutable.opDispatch` 
should not be deduced to be pure, and this not be callable from 
`test`.


More information about the Digitalmars-d-learn mailing list