Jump to page: 1 2
Thread overview
How to disable assigning a value to a property?
Jul 06, 2021
Jack Applegame
Jul 06, 2021
drug
Jul 06, 2021
Jack Applegame
Jul 06, 2021
Dennis
Jul 06, 2021
Jack Applegame
Jul 06, 2021
Adam D Ruppe
Jul 06, 2021
Jack Applegame
Jul 06, 2021
Mike Parker
Jul 06, 2021
jfondren
Jul 06, 2021
jfondren
Jul 07, 2021
Tejas
July 06, 2021

Code:

import std.stdio;

struct Field {
    void opAssign(int a) {
        writefln("Field.opAssign(%s)", a);
    }
}

struct Register {
    Field clock(int a) {
        writefln("Register.clock(%s)", a);
        return Field();
    }
}


void main() {
    Register register;
    register.clock(1) = 10; // works, good
    register.clock = 10;    // works too, how to disable it?
}

How to disable register.clock = 10; but allow register.clock(1) = 10;?
I want to get a compilation error on register.clock = 10;

July 06, 2021
06.07.2021 13:06, Jack Applegame пишет:
> Code:
> ```d
> import std.stdio;
> 
> struct Field {
>      void opAssign(int a) {
>          writefln("Field.opAssign(%s)", a);
>      }
> }
> 
> struct Register {
>      Field clock(int a) {
>          writefln("Register.clock(%s)", a);
>          return Field();
>      }
> }
> 
> 
> void main() {
>      Register register;
>      register.clock(1) = 10; // works, good
>      register.clock = 10;    // works too, how to disable it?
> }
> ```
> How to disable `register.clock = 10;` but allow `register.clock(1) = 10;`?
> I want to get a compilation error on `register.clock = 10;`
> 

Something like using different types for arguments in `Register.clock` and `Field.opAssign`?
July 06, 2021

On Tuesday, 6 July 2021 at 10:06:11 UTC, Jack Applegame wrote:

>

How to disable register.clock = 10; but allow register.clock(1) = 10;?
I want to get a compilation error on register.clock = 10;

We're still awaiting formal assessment on dip1038, but if that gets in, you can mark clock or Field @nodicard. Otherwise I don't know of a way.

July 06, 2021
On Tuesday, 6 July 2021 at 10:24:45 UTC, drug wrote:
> Something like using different types for arguments in `Register.clock` and `Field.opAssign`?

I've been thinking about it. Unfortunately, this is not always convenient.
July 06, 2021

On Tuesday, 6 July 2021 at 10:25:28 UTC, Dennis wrote:

>

We're still awaiting formal assessment on dip1038, but if that gets in, you can mark clock or Field @nodicard. Otherwise I don't know of a way.

Yes, it would help.

July 06, 2021

On Tuesday, 6 July 2021 at 10:06:11 UTC, Jack Applegame wrote:

>

How to disable register.clock = 10;

You don't. The language always allows a = b; to be rewritten as a(b);.

Best you can do is use different types for the two arguments. Maybe clock could take a struct Clock { int x; } or something instead.

July 06, 2021

On Tuesday, 6 July 2021 at 12:33:20 UTC, Adam D Ruppe wrote:

>

The language always allows a = b; to be rewritten as a(b);.

And that's sad. It should happen for properties only.

July 06, 2021

On Tuesday, 6 July 2021 at 13:27:43 UTC, Jack Applegame wrote:

>

And that's sad. It should happen for properties only.

Totally disagree. This is one of my favorite D features.

July 06, 2021

On 7/6/21 9:27 AM, Jack Applegame wrote:

>

On Tuesday, 6 July 2021 at 12:33:20 UTC, Adam D Ruppe wrote:

>

The language always allows a = b; to be rewritten as a(b);.

And that's sad. It should happen for properties only.

Yes, I lament that there is no way to control how people call your function. It can result in surprising things, and it means as a library designer you have to consider this usage when picking names.

There are a few "draft" DIP proposals (under the old DIP system) here: https://wiki.dlang.org/DIPs

But I think the time of being able to make such a disruptive change has passed. For better or worse we have the half-implemented near-useless meaning of @property, and basically it's unneeded.

-Steve

July 06, 2021

On Tuesday, 6 July 2021 at 10:06:11 UTC, Jack Applegame wrote:

>

How to disable register.clock = 10; but allow register.clock(1) = 10;?
I want to get a compilation error on register.clock = 10;

Some options:

  1. return a temporary struct with an opIndex
import std.stdio;

struct Field {
    void opAssign(int a) {
        writefln("Field.opAssign(%s)", a);
    }
}

struct ClockAssign {
    Field opIndex(int a) {
        writefln("Register.clock(%s)", a);
        return Field();
    }
}

struct Register {
    ClockAssign clock() {
        return ClockAssign();
    }
}

void main() {
    Register register;
    register.clock[1] = 10; // works, good
    //register.clock = 10; // error
}
  1. https://run.dlang.io/is/bkV64U - keep track of fields and fail at runtime if a field was never initialized (because it was silently discarded in this case).

  2. https://run.dlang.io/is/AJM6Vg - hybrid where ClockAssign has an unsafe pointer that the compiler complains about :/

« First   ‹ Prev
1 2