Implementing typestate
BBasile via Digitalmars-d
digitalmars-d at puremagic.com
Tue Sep 15 10:57:08 PDT 2015
On Tuesday, 15 September 2015 at 17:45:45 UTC, Freddy wrote:
> Would it be worth implementing some kind of typestate into the
> language?
> By typestate I mean a modifiable enum.
>
> For example:
> ---
> enum FState
> {
> none,
> read,
> write
> }
>
> struct File
> {
> //maybe another keyword other than enum
> enum state = FState.none;
>
> void openRead(string name)
> {
> //evalutaed in a way similar to static if
> state = FState.read;
> //...
> }
>
> void openWrite(string name)
> {
> state = FState.write;
> //...
> }
>
> ubyte[] read(size_t) if (state == FState.read)
> {
> //...
> }
>
> void write(ubyte[]) if (state == FState.write)
> {
> //...
> }
> }
>
> unittest
> {
> File f;
> static assert(f.state == FState.none);
> f.openRead("a.txt");
> static assert(f.state == FState.read);
> auto data = f.read(10);
> }
> ---
>
> We could use this "typestate" to implement:
> Rust style memory management in a library
> Safer Files (as shown)
> Possibly other ideas
>
> Thoughts?
This won't work in D. Everything that's static is common to each
instance.
What's possible however is to use an immutable FState that's set
in the ctor.
---
struct File
{
immutable FState state,
this(string fname, FState st){state = st}
}
---
Than you're sure that your file state can't be changed by error.
Otherwise just hide the state to set it as a private variable...
More information about the Digitalmars-d
mailing list