What is pure used for?

Paul Backus snarwin at gmail.com
Thu Nov 25 15:17:00 UTC 2021


On Thursday, 25 November 2021 at 07:26:48 UTC, sclytrack wrote:
> int * pureFunction()
>
> 1) the pointer needs to be the same.
> 2) the value that the pointer points to needs to be the same. I 
> call this the "value
> of interest" with relation to pure. The pointer doesn't matter.
> 3) both the pointer and the value the pointer is pointing too 
> needs to be the same.
>
> pureCalloc() satisfies (2)
> pureMalloc() violates everything.

There is a special case in the language spec to allow functions 
like `pureMalloc`. They are called "pure factory functions":

> A *pure factory function* is a strongly pure function that 
> returns a result that has mutable indirections. All mutable 
> memory returned by the call may not be referenced by any other 
> part of the program, i.e. it is newly allocated by the 
> function. Nor may the mutable references of the result refer to 
> any object that existed before the function call.

Source: <https://dlang.org/spec/function.html#pure-functions> 
(scroll down)

> Does the D compiler do any optimizations?

Yes, but those optimizations may result in implementation-defined 
behavior:

> **Implementation Defined:** An implementation may assume that a 
> strongly pure function that returns a result without mutable 
> indirections will have the same effect for all invocations with 
> equivalent arguments. It is allowed to memoize the result of 
> the function under the assumption that equivalent parameters 
> always produce equivalent results. [...] An implementation is 
> currently not required to enforce validity of memoization in 
> all cases.

The term "equivalent" is not explicitly defined, but as far as I 
can tell it means something like item (2) in your list.


More information about the Digitalmars-d-learn mailing list