digitalmars.D - object states
- Henning Pohl (15/15) Oct 07 2012 Imagine you want an image to keep the width of 512:
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (10/25) Oct 07 2012 Sounds good. You haven't mentioned the invariant keyword, so perhaps you...
- Henning Pohl (12/20) Oct 07 2012 How would you resolve the issue I wrote in my first post using
- simendsjo (41/65) Oct 08 2012 You can create a wrapper struct that includes an invariant:
- Henning Pohl (8/48) Oct 08 2012 There is a difference between invariants and what I call states.
Imagine you want an image to keep the width of 512: void func(Image img) { assert(img.width == 512); img.doSomething(); assert(img.width == 512); while (img.somethingElse()) { assert(img.width == 512) someFunc(img); assert(img.width == 512); } } In theory, every call to a function can change the width of the image. What do you think about this: https://dl.dropbox.com/u/34762907/temp/prop1.html I do know it can be implemented in D4 only.
Oct 07 2012
On 10/07/2012 11:44 AM, Henning Pohl wrote:Imagine you want an image to keep the width of 512: void func(Image img) { assert(img.width == 512); img.doSomething(); assert(img.width == 512); while (img.somethingElse()) { assert(img.width == 512) someFunc(img); assert(img.width == 512); } } In theory, every call to a function can change the width of the image. What do you think about this: https://dl.dropbox.com/u/34762907/temp/prop1.html I do know it can be implemented in D4 only.Sounds good. You haven't mentioned the invariant keyword, so perhaps you are not aware of that feature? http://dlang.org/class.html#Invariant http://dlang.org/dbc.html Although the docs seem to favor classes, invariant is available for structs as well. Ali -- D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
Oct 07 2012
On Sunday, 7 October 2012 at 20:18:15 UTC, Ali Çehreli wrote:Sounds good.Thanks.You haven't mentioned the invariant keyword, so perhaps you are not aware of that feature? http://dlang.org/class.html#Invariant http://dlang.org/dbc.html Although the docs seem to favor classes, invariant is available for structs as well. AliHow would you resolve the issue I wrote in my first post using invariants? You cannot add/remove checks from invariants while using the object. That's what I made different. But there are still some limits given by the language. Look at point 7 for instance. The problem about contract programming in general is you cannot use it in public library code. Distinction between logic and user input is a very important thing, we really need to improve this. You may have noticed that I did not make use of either assert or enforce. I didn't want to specify this.
Oct 07 2012
On Sunday, 7 October 2012 at 20:46:09 UTC, Henning Pohl wrote:On Sunday, 7 October 2012 at 20:18:15 UTC, Ali Çehreli wrote:You can create a wrapper struct that includes an invariant: import std.stdio; struct Image { int width; void doSomething() { } void modifiesWidth() { --width; } } void func(Image img) { struct ImgWrapper { Image* img; this(ref Image img) { this.img = &img; } invariant() { assert(img.width == 512); } void opDispatch(string s)() { mixin("img."~s~"();"); } } auto wrapper = ImgWrapper(img); wrapper.doSomething(); wrapper.modifiesWidth(); // assertion failure } void main() { Image img = { 512 }; func(img); }Sounds good.Thanks.You haven't mentioned the invariant keyword, so perhaps you are not aware of that feature? http://dlang.org/class.html#Invariant http://dlang.org/dbc.html Although the docs seem to favor classes, invariant is available for structs as well. AliHow would you resolve the issue I wrote in my first post using invariants? You cannot add/remove checks from invariants while using the object. That's what I made different. But there are still some limits given by the language. Look at point 7 for instance. The problem about contract programming in general is you cannot use it in public library code. Distinction between logic and user input is a very important thing, we really need to improve this. You may have noticed that I did not make use of either assert or enforce. I didn't want to specify this.
Oct 08 2012
On Monday, 8 October 2012 at 08:53:39 UTC, simendsjo wrote:You can create a wrapper struct that includes an invariant: import std.stdio; struct Image { int width; void doSomething() { } void modifiesWidth() { --width; } } void func(Image img) { struct ImgWrapper { Image* img; this(ref Image img) { this.img = &img; } invariant() { assert(img.width == 512); } void opDispatch(string s)() { mixin("img."~s~"();"); } } auto wrapper = ImgWrapper(img); wrapper.doSomething(); wrapper.modifiesWidth(); // assertion failure } void main() { Image img = { 512 }; func(img); }There is a difference between invariants and what I call states. States clear things up when you actually need to do a runtime check and when not. Invariants are always checked, because you don't care about performance in debug mode. A Number<positive> is positive already and will stay positive while you can access it. De facto you cannot change a Number<positive> to a negative number.
Oct 08 2012