Thread overview
Faking a non-pure function as pure
Feb 16, 2018
Nordlöw
Feb 16, 2018
Ali Çehreli
Feb 17, 2018
Nordlöw
February 16, 2018
I'm struggling with my definition of assumePure that should make a non-pure function `f` callable as pure `pureF`.

I've copied the definition of assumePure from the Phobos docs at

https://dlang.org/phobos/std_traits.html#SetFunctionAttributes

and managed to define pureF using it but I cannot call `pureF` as either

    auto x = (*pureF)(42);
    auto x = pureF(42);

How do I do that?

import std.traits : isFunctionPointer, isDelegate, functionAttributes, FunctionAttribute, SetFunctionAttributes, functionLinkage;

/** Return `T` assumed to be `pure`.
    Copied from https://dlang.org/phobos/std_traits.html#SetFunctionAttributes.
    */
auto assumePure(T)(T t)
    if (isFunctionPointer!T || isDelegate!T)
{
    enum attrs = functionAttributes!T | FunctionAttribute.pure_;
    return cast(SetFunctionAttributes!(T, functionLinkage!T, attrs)) t;
}

int f(int x)
{
    return x + 1;
}

void g() pure
{
    static assert(!__traits(compiles, { auto x = f(42); }));
    alias pureF = assumePure!(typeof(&f));
    // TODO: how do I call pureF?
    // auto x = (*pureF)(42);
    // auto x = pureF(42);
}

February 16, 2018
On 02/16/2018 09:58 AM, Nordlöw wrote:

> void g() pure
> {
>      static assert(!__traits(compiles, { auto x = f(42); }));
>      alias pureF = assumePure!(typeof(&f));
>      // TODO: how do I call pureF?
>      // auto x = (*pureF)(42);
>      // auto x = pureF(42);
> }
> 

    auto pureF = assumePure(&f);
    pureF(42);

Ali
February 17, 2018
On Friday, 16 February 2018 at 18:03:40 UTC, Ali Çehreli wrote:
>     auto pureF = assumePure(&f);
>     pureF(42);
>
> Ali

Thanks!