Generic Property Implementation

Simen Kjærås simen.kjaras at gmail.com
Fri Mar 9 14:46:04 UTC 2018


On Friday, 9 March 2018 at 01:22:15 UTC, Mike Franklin wrote:
> * binary assignment operators (e.g. +=)
> * unary assignment operators (e.g. ++)
> * @safe, @nogc, and -betterC compatible
> * at least as good code generation as that proposed in the DIP 
> when optimizations are enabled.
> * And should be scalable to data that isn't addressable (e.g. 
> bitfields).  See
> https://issues.dlang.org/show_bug.cgi?id=16187

This is the best I've come up with in the current language:

struct S {
     int n;
     mixin property!("field", "get => this.n", "set => this.n = 
set");
}

unittest {
     import std.conv : to;
     S s;
     s.field = 3;
     assert(s.field == 3);
     s.field += 2;
     assert(s.field == 5);
     s.field++;
     assert(s.field == 6);
     assert(s.field.to!string == "6");
}

Sadly, there are issues:

1) Wrong return type:
unittest {
     S s;
     auto a = s.field;
     // Fails - typeof(a) is Property!((get) => this.n, (set) => 
this.n = set)
     assert(is(typeof(a) == int));
}
Not a whole lot to do about this. I've pondered writing a DIP on 
auto-decaying/rvalue types, which would decay to a different type 
the moment they're passed to a function or assigned to a 
variable. The feature would probably not be worth the trouble, 
though.


2) Noisy syntax:
If I had my druthers, mixin templates would be mixin'd 
automatically, and eponymous mixin templates would be a thing. 
That would give us this syntax:

struct S {
     int n;
     property!("get => this.n", "set => this.n = set") field;
}


3) Stringy functions:
The string literal functions are an eyesore, but would require 
some compiler work to fix. This fails:

struct S {
     int n;
     mixin property!("field", get => this.n, set => this.n = set);
}

The reason is there's no 'this' at the point of instantiation, 
since we're in the context of the type, not a function where 
'this' makes sense. It seems to me this should be fixable, but I 
have no idea how much work would be required.


4) 'this' in function bodies
It should be possible to write "get => this.n" as "get => n". 
There's no ambiguity as to which 'n' I'm referring to. Filed a 
bug:
https://issues.dlang.org/show_bug.cgi?id=18584

Implementation:
https://gist.github.com/Biotronic/5849af011cbe9c7ea05515011d5995bf

--
   Simen


More information about the Digitalmars-d-learn mailing list