Memory allocation purity
Don via Digitalmars-d
digitalmars-d at puremagic.com
Thu May 15 02:45:51 PDT 2014
On Thursday, 15 May 2014 at 08:14:50 UTC, luka8088 wrote:
> On 15.5.2014. 8:58, Jonathan M Davis via Digitalmars-d wrote:
>> On Thu, 15 May 2014 05:51:14 +0000
>> via Digitalmars-d <digitalmars-d at puremagic.com> wrote:
>>
>>> Yep, purity implies memoing.
>>
>> No, it doesn't. _All_ that it means when a function is pure is
>> that it cannot
>> access global or static variables unless they can't be changed
>> after being
>> initialized (e.g. they're immutable, or they're const value
>> types), and it
>> can't call any other functions which aren't pure. It means
>> _nothing_ else. And
>> it _definitely_ has nothing to do with functional purity.
>>
>> Now, combined with other information, you _can_ get functional
>> purity out it -
>> e.g. if all the parameters to a function are immutable, then
>> it _is_
>> functionally pure, and optimizations requiring functional
>> purity can be done
>> with that function. But by itself, pure means nothing of the
>> sort.
>>
>> So, no, purity does _not_ imply memoization.
>>
>> - Jonathan M Davis
>>
>
> Um. Yes it does. http://dlang.org/function.html#pure-functions
> "functional purity (i.e. the guarantee that the function will
> always
> return the same result for the same arguments)"
>
> The fact that it should not be able to effect or be effected by
> the
> global state is not a basis for purity, but rather a
> consequence.
>
> Even other sources are consistent on this matter, and this is
> what
> purity by definition is.
Please note: D's 'pure' annotation does *not* mean that the
function is pure. It means that it is statically verified to be
OK to call it from a pure function.
The compiler determines if a function is pure, the programmer
never does.
There are two things going on here, and they are quite distinct.
(1) Really the keyword should be something like '@noglobal',
rather than 'pure'. It's called pure for historical reasons. To
reduce confusion I'll call D's pure '@noglobal' and the
functional languages pure '@memoizable'.
But it turns out that @memoizable isn't actually an interesting
property, whereas '@noglobal' is.
"No global state" is a deep, transitive property of a function.
"Memoizable" is a superficial supersetextra property which the
compiler can trivially determine from @noglobal.
Suppose you have function f(), which calls function g().
If f does not depend on global state, then g must not depend on
global state.
BUT if f() can be memoizable even if g() is not memoizable.
This approach used by D enormously increases the number of
functions which can be statically proven to be pure. The
nomenclature can create confusion though.
(2) Allowing GC activity inside a @noglobal function does indeed
weaken our ability to memoize.
The compiler can still perform memoizing operations on most
functions that return GC-allocated memory, but it's more
difficult. We don't yet have data on how much of a problem this
is.
An interesting side-effect of the recent addition of @nogc to the
language, is that we get this ability back.
More information about the Digitalmars-d
mailing list