Property discussion wrap-up
Zach the Mystic
reachBUTMINUSTHISzach at gOOGLYmail.com
Wed Jan 30 10:05:07 PST 2013
On Wednesday, 30 January 2013 at 17:35:25 UTC, Dmitry Olshansky
wrote:
>> Okay, cool. Two questions remain: 1) How hard to implement
>> structs
>> nested in structs to mimic ones nested in functions?
>
>
> IMO if property is to be implemented in the library it has to
> include the field itself. (And I suspect properties should
> enjoy compiler support).
>
> Then something like:
>
> struct A{
> Property!(int, filter, getter) prop;
> private:
> void func()
> {
> ...
> prop.raw = xxx; //direct write
> prop = yyy; //goes through setter
> }
> }
>
> where .raw is the field itself and there must be a way to let
> only struct itself have access to it. I have one method to get
> this but I don't like it - put this in each module:
>
> mixin PropertyForModule!(my_module);
>
> introducing a Property template in this module, with private
> .raw accessible thusly only in this module.
>
> Getter is then just any function that maps T => T, with x => x
> by default so can be omitted.
>
> Filter is something new but in essence it works like the
> following setter:
>
> void setter(T)(ref T val, T newVal)
> {
> val = filter(newVal); //filter may through
> }
>
> It's a bit more restrictive though so feel free to destroy.
Does my suggestion about the compiler detecting a struct with no
data warm you up a bit to properties as structs? If so, there is
really very little need for ANY library support. Strangely,
implementing struct-nested structs with actual data could be a
significantly harder task than implementing them with no data. No
extra pointer need be created.
I'll try to summarize the changes required. The first two are
necessary. The third is for aesthetic reasons, but as in the case
of lambda functions that could make a huge difference.
1. Have non-static struct-nested structs be able to refer to
their parent's data. With no-data structs, I suspect this will be
easy, and it's actually the primary intended usage, which makes
only the corner case tricky, where new pointers must be added,
etc.
2. Add opGet to the compiler's list of overloads. It is simply
opCall but with parens banned instead of mandated.
3. Enable Highlander structs so that defining a property is as
easy as define a new-style lamba:
struct __fooHidden {}
__fooHidden foo;
simply becomes:
foo struct {}
More information about the Digitalmars-d
mailing list