On 5/28/2017 6:01 PM, Stefan Koch via Digitalmars-d-learn wrote:
On Monday, 29 May 2017 at 00:53:25 UTC, Brad Roberts wrote:
On 5/28/2017 5:34 PM, Jonathan M Davis via Digitalmars-d-learn wrote:
On Sunday, May 28, 2017 16:49:16 Brad Roberts via
Digitalmars-d-learn wrote:
Is there a mechanism for declaring something pure when it's built from
parts which individually aren't?
string foo(string s)
{
// do something arbitrarily complex with s that doesn't touch
globals or change global state except possibly state of the heap or gc
return s;
}
<snip lecture> you can cast </snip lecture>
Ok, so there essentially isn't. I'm well aware of the risks of lying
to the compiler, but it's also not sufficiently smart to unravel
complex code. Combined with there being interesting parts of the
standard libraries that themselves aren't marked pure, there's a real
need for escape hatches. A simple example: anything that has a
malloc/free pair.
There is
void[] myPureMalloc(uint size) pure @trusted nothrow @nogc
{
alias pure_malloc_t = pure nothrow void* function(size_t size);
return (cast(pure_malloc_t)malloc)(size)[0 .. size];
}
That's still a cast. It's a nice way to isolate the cast, but it's
clearly still there. And as I said, that's just one simple example.