Communicating between in and out contracts

Steven Schveighoffer schveiguy at yahoo.com
Tue Oct 20 09:04:20 PDT 2009


On Tue, 20 Oct 2009 11:57:05 -0400, Michel Fortin  
<michel.fortin at michelf.com> wrote:

> On 2009-10-20 11:44:00 -0400, "Steven Schveighoffer"  
> <schveiguy at yahoo.com> said:
>
>> On Tue, 20 Oct 2009 08:36:14 -0400, Michel Fortin   
>> <michel.fortin at michelf.com> wrote:
>>
>>> On 2009-10-20 08:16:01 -0400, "Steven Schveighoffer"   
>>> <schveiguy at yahoo.com> said:
>>>
>>>> Incidentally, shouldn't all access to the object in the in contract  
>>>> be   const by default anyways?
>>>  Hum, access to everything (including global variables, arguments),  
>>> not  just the object, should be const in a contract. That might be  
>>> harder to  implement though.
>>  Yeah, you are probably right.  Of course, a const function can still  
>> alter  global state, but if you strictly disallowed altering global  
>> state, we are  left with only pure functions (and I think that's a  
>> little harsh).
>
> Not exactly. Pure functions can't even read global state (so their  
> result can't depend on anything but their arguments), but it makes  
> perfect sense to read global state in a contract. What you really need  
> is to have a const view of the global state. And this could apply to all  
> asserts too.

Yes, but what I'm talking about is "what functions can you call while in a  
contract."  Access to data should be const as you say.  But if you follow  
that logic to the most strict interpretation, the only "safe" functions to  
allow are pure functions.

i.e.:

int x;

class C
{
   void foo()
   in
   {
     x = 5; // I agree this should be an error
     bar(); // ok?
   }
   {}

   void bar() const
   {
     x = 5;
   }
}

-Steve



More information about the Digitalmars-d mailing list