On 2013-04-08, 17:07, Jacob Carlborg wrote:
On 2013-04-08 14:52, Iain Buclaw wrote:
On 8 April 2013 13:25, Jacob Carlborg <[email protected] <mailto:[email protected]>>
wrote:
On 2013-04-08 10:29, Iain Buclaw wrote:
This information could possibly be helpful. Though given that
most of
(gdc) codegen is on par with g++, there's probably not much on
the list
that isn't already detected by the backend optimisation passes.
Multiple calls to pure functions could be cached.
--
/Jacob Carlborg
Not always, but in some circumstances, yes.
---
struct Foo
{
int a = 0;
pure int bar (immutable int x)
{
++a;
return x * 2;
}
}
void main()
{
Foo f;
int i = f.bar(2) + f.bar(2);
assert (i == 8);
assert (f.a == 2);
}
I though that wasn't possible. What's the point of pure if that's
possible?
Like others have stated, it's so you can do this:
struct Foo {
int a = 0;
pure int bar( int n ) { // Weakly pure
a += n;
return a;
}
}
pure int Baz( int n ) { // Strongly pure
Foo foo;
return foo.bar( n );
}
Foo.bar has only local mutability, so if the Foo originated in a
(strongly) pure function, Foo.bar can be called inside that pure
function without violating the purity requirement.
The three levels (weakly pure/strongly pure/impure) are needed,
but a redesign would perhaps use a different keyword for weakly
pure.
--
Simen