memoize
Jonathan M Davis
jmdavisProg at gmx.com
Mon Jan 3 23:28:41 PST 2011
On Monday 03 January 2011 22:59:37 Guilherme Vieira wrote:
> Ah, I was under the impression that @trusted was used to force purity.
> Shame.. Sorry I mixed things up.
>
> In any case, aren't those rules a bit too rigid? No matter how you look at
> memoize, it should generate pure functions (since it exhibits pure nature,
> are logically pure or whatever you call it). Would it be tough on the
> compiler for it to actually find if a function is pure or not by a more
> detailed analysis of its behavior?
@safe, @trusted, and @system have nothing to do with purity. If a function is
marked as pure, then it's pure. If it's not, then it's not. End of story. Now,
the concept of "weakly" pure functions was recently added, but all pure
functions are still marked with pure. Strongly pure functions are pure functions
where all of the parameters are immutable or implicitly convertible to immutable
(so, immutable variables and value types). Weakly pure functions are pure
functions whose parameters are not all immutable or implicitly convertible to
immutable. Unlike strongly pure functions, they can alter their arguments.
However, just like strongly pure functions, they cannot access globals or
statics. Strongly pure functions can be optimized such that only one call to
them is made in an expression because their return value will always be the
same, and they cannot alter their parameters. Weakly pure functions cannot be
optimized in that manner, but because they don't alter the global state, they
can be safely called from strongly pure functions without violating the strongly
pure function's purity.
Pure is not logically pure for essentially the same reasons that const is not
logically const. Making it logical instead of guaranteed eliminates the
guarantees, and the compiler can no longer rely on those guarantees, making them
_far_ less valuable.
It is true that a memoized function must be logically pure, or you're going to
get errors. However, if you were to force such functions to be pure, it would be
highly limiting. And since memoize _can't_ be pure, it would make recursion with
memoize impossible. True, allowing for memoized functions to be impure makes it
so that the programmer must be more careful, but it's still quite useful - in
fact more useful - that way. And since you _can't_ have memoize be pure anyway,
it's not like you're losing any guarantees from the compiler like if you tried
to make pure logically pure or const logically const.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list