Thread overview | |||||
---|---|---|---|---|---|
|
February 16, 2018 Faking a non-pure function as pure | ||||
---|---|---|---|---|
| ||||
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 Re: Faking a non-pure function as pure | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nordlöw | 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 Re: Faking a non-pure function as pure | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Friday, 16 February 2018 at 18:03:40 UTC, Ali Çehreli wrote:
> auto pureF = assumePure(&f);
> pureF(42);
>
> Ali
Thanks!
|
Copyright © 1999-2021 by the D Language Foundation