On 10/27/2011 9:04 PM, bearophile wrote:
> Agreed. In fact, it occurred to me the other day that we could write
> contracts as
>
> void foo(T t)
> {
> scope(in) {
> // pre-condition contracts
> }
> scope(out) {
> // post-condition contracts
> }
> // ...body of function...
> }
>
How do you replace out(result) with scope(out) {} ?
I am not sure that we need to. D2 has two forms of the 'out()' statement
now: 'out(result)' and 'out(...)' [as it is shown in the DPL book, or
just 'out' in current practice].
The only reason to have an 'out(result)' form is to declare that we
intend to use the magic 'result' symbol in the post-condition testing.
Does this mean that, if we *don't* pre-declare 'out(result)' that the
symbol 'result' can have some *other* meaning in the post-condition?
That strikes me as a source of subtle bugs, if a programmer might
accidentally fail to declare 'out(result)' and thereby get different
semantics in the post-condition code without having changed that code.
I think the thing to do is to just declare 'out' as we currently do [or
'scope(out)' as I am proposing], and treat the 'result' symbol magically
in the post-condition code whether or not it is pre-declared -- that is,
have the compiler find it and interpret it as the magic returned-value.
-- Davidson