Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
November 09, 2004 contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Me again:
<code>
int main(){
return foo(1);
}
struct a {int b;}
int foo(int i) {
a bar()
// uncomment for error
/*out (result) {
// out body
}
body */{
a r;
r.b = 1;
return r;
}
return bar().b;
}
</code>
you probably need to specify -debug to get it.
Any derived type (structures, arrays, functions
(can you return a function?)) as a return type for
a nested function with any in/out/body block (even just body)
causes this.
--
Using Opera's revolutionary e-mail client: http://www.opera.com/m2/
|
November 11, 2004 Re: contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Buchan | I don't know what in specific you mean, but there are several syntactical errors here. "Buchan" <kbuchan@xtra.co.nz> wrote in message news:opsg68fuvz44buww@simon.mshome.net... > Me again: > > <code> > int main(){ > return foo(1); > } > > struct a {int b;} > > int foo(int i) { > a bar() > // uncomment for error > /*out (result) { > // out body > } > body */{ > a r; > r.b = 1; > return r; > } > > return bar().b; > } > </code> > > you probably need to specify -debug to get it. > Any derived type (structures, arrays, functions > (can you return a function?)) as a return type for > a nested function with any in/out/body block (even just body) > causes this. > > -- > Using Opera's revolutionary e-mail client: http://www.opera.com/m2/ |
November 11, 2004 Re: contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | On Thu, 11 Nov 2004 01:12:01 -0800, Walter <newshound@digitalmars.com> wrote: > I don't know what in specific you mean, but there are several syntactical > errors here. > > "Buchan" <kbuchan@xtra.co.nz> wrote in message > news:opsg68fuvz44buww@simon.mshome.net... >> Me again: >> >> <code> >> int main(){ >> return foo(1); >> } >> >> struct a {int b;} >> >> int foo(int i) { >> a bar() >> // uncomment for error >> /*out (result) { >> // out body >> } >> body */{ >> a r; >> r.b = 1; >> return r; >> } >> >> return bar().b; >> } >> </code> >> <snip> Specificly? It compiles fine with it commented, and complains when uncommented. Is there any reason that a nested function that returns a non-basic type cannot have in/out contracts? Or am I being really stupid again? -- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/ |
November 11, 2004 Re: contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Buchan | "Buchan" <kbuchan@xtra.co.nz> wrote in message news:opshaqkvgr44buww@simon.mshome.net... > On Thu, 11 Nov 2004 01:12:01 -0800, Walter <newshound@digitalmars.com> wrote: > > > I don't know what in specific you mean, but there are several syntactical > > errors here. > > > > "Buchan" <kbuchan@xtra.co.nz> wrote in message news:opsg68fuvz44buww@simon.mshome.net... > >> Me again: > >> > >> <code> > >> int main(){ > >> return foo(1); > >> } > >> > >> struct a {int b;} > >> > >> int foo(int i) { > >> a bar() > >> // uncomment for error You need an in{} preceding the out{}. > >> /*out (result) { > >> // out body > >> } > >> body */{ > >> a r; > >> r.b = 1; > >> return r; > >> } > >> > >> return bar().b; > >> } > >> </code> > >> <snip> > > Specificly? It compiles fine with it commented, and complains when > uncommented. > Is there any reason that a nested function that returns a non-basic type > cannot > have in/out contracts? Or am I being really stupid again? > > -- > Using Opera's revolutionary e-mail client: http://www.opera.com/m2/ |
November 11, 2004 Re: contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | Walter schrieb am Donnerstag, 11. November 2004 19:53:
> You need an in{} preceding the out{}.
Nested functions require a full set of in&out&body whereas "normal" functions require one of the combinations: body, in&body, out&body or in&out&body.
Is this a bug or a language feature that I missed while reading the documentation?
In addition I might have missed the sequence requirements for in/out/body.
e.g. out/in/body compiles, but in/body/out fails
Thomas
|
November 13, 2004 Re: contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Thomas Kühne | I'll review it again and straighten it out. "Thomas Kühne" <thomas-dloop@kuehne.cn> wrote in message news:cn0llv$10u5$1@digitaldaemon.com... > Walter schrieb am Donnerstag, 11. November 2004 19:53: > > You need an in{} preceding the out{}. > > Nested functions require a full set of in&out&body whereas "normal" functions require one of the combinations: body, in&body, out&body or in&out&body. > > Is this a bug or a language feature that I missed while reading the documentation? > > In addition I might have missed the sequence requirements for in/out/body. > > e.g. out/in/body compiles, but in/body/out fails > > Thomas > |
November 14, 2004 Re: contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | On Thu, 11 Nov 2004 10:53:48 -0800, Walter <newshound@digitalmars.com> wrote: > > "Buchan" <kbuchan@xtra.co.nz> wrote in message > news:opshaqkvgr44buww@simon.mshome.net... >> On Thu, 11 Nov 2004 01:12:01 -0800, Walter <newshound@digitalmars.com> >> wrote: >> <snip> > > You need an in{} preceding the out{}. > <snip> Oh? I didnt see that in the documentation... but it does the same even with both. int main(){ return foo(); } struct a {int b;} int foo() { a bar() /* in { assert(1); } out (result) { assert(result.b); } body*/ { a r; r.b = 1; return r; } a r2 = bar(); return r2.b; } If you rewrite this to return a basic type like int, it's fine. (Of course, I've made an idiot of myself before... ;) -- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/ |
November 14, 2004 Re: contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Buchan | added to DStress as http://svn.kuehne.cn/dstress/run/in_out_body_01.d ... http://svn.kuehne.cn/dstress/run/in_out_body_04.d Thomas Buchan schrieb am Sonntag, 14. November 2004 07:50: > Oh? I didnt see that in the documentation... but it does the same even with both. > > int main(){ > return foo(); > } > > struct a {int b;} > > int foo() { > a bar() > /* in > { > assert(1); > } > out (result) > { > assert(result.b); > } > body*/ > { > a r; > r.b = 1; > return r; > } > > a r2 = bar(); > return r2.b; > } > > If you rewrite this to return a basic type like int, it's fine. (Of course, I've made an idiot of myself before... ;) |
November 15, 2004 Re: contracts + nested functions + derived types = poo | ||||
---|---|---|---|---|
| ||||
Posted in reply to Thomas Kühne | Looking at the code, I see I accidently left my old e-mail in my account...
BTW, I really should use better names for my variables, nice clean (I think
I wrote that after reading some of the DMD frontend code though ]:D)
--
Using Opera's revolutionary e-mail client: http://www.opera.com/m2/
|
Copyright © 1999-2021 by the D Language Foundation