To help LDC/GDC

Timon Gehr timon.gehr at gmx.ch
Mon Apr 8 09:59:34 PDT 2013


On 04/08/2013 05:07 PM, Jacob Carlborg wrote:
> On 2013-04-08 14:52, Iain Buclaw wrote:
>> On 8 April 2013 13:25, Jacob Carlborg <doob at me.com <mailto:doob at me.com>>
>> 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?
>

Foo.bar can be used in a strongly pure computation. It is superficially 
similar to how state transformers allow mutable state in Haskell.

If you want more guarantees, you could mark a member function const, 
inout or immutable pure.

DIP30 removes some optimization potential for at least const pure.

Furthermore, the exact meaning of inout will have to be determined. 
Unfortunately it is both useful to have a specifier that prevents 
mutation but allows to return a mutable part of the function input and 
to have a specifier that allows mutation in case the function input is 
in fact mutable.

Unfortunately, DMD does not implement type checking for delegates in a 
meaningful way. The specifiers const/immutable/pure should have 
consistent meanings for member functions and functions nested inside 
functions.

(http://d.puremagic.com/issues/show_bug.cgi?id=9148)



More information about the Digitalmars-d mailing list