John C schrieb:
Walter Bright wrote:
Having optional parentheses does lead to unresolvable ambiguities. How much of a problem that really is is debatable, but let's assume it should be resolved. To resolve it, a property must be distinguishable from a regular function.

One way is to simply add a "property" attribute keyword:

  property bool empty() { ... }
  property void empty(bool b) { ... }

The problem is that:

1. there are a lot of keywords already
2. keywords are global things

Well, property probably isn't too common a variable name, so it shouldn't impact existing code.


The alternative is to have a unique syntax for properties. Ideally, the syntax should be intuitive and mimic its use. After much fiddling, and based on n.g. suggestions, Andrei and I penciled in:

  bool empty { ... }
  void empty=(bool b) { ... }

The only problem is when a declaration but not definition is desired:

  bool empty;

but oops! That defines a field. So we came up with essentially a hack:

  bool empty{}

i.e. the {} means the getter is declared, but defined elsewhere.

Would unimplemented setters look like this:

void empty = (bool b) {}

?


What do you think?

Looks a bit odd. Perhaps it's just the unfamiliarity of the syntax. Most of us got used to templates, eventually.

My own syntax suggestion requires no new keywords (contextual or otherwise).

interface INameable {

  string name {
    ();
    (value);
  }

}

class Person : INameable {

  private string name_;

  string name {
    () { return name_; }
    (value) { name_ = value; }
  }

}

In the above example, "value" could be anything the class designer wants - to the compiler, empty parentheses () represent the getter, (blah) the setter.

Looks good. You could have wrapper properties like:
---
class Clock {
        private int sec_;
        int min {
                () {return sec_ / 60;}
                (m) {sec_ = m * 60;}
        }
}
---
auto c = new Clock;
c.min = 2;
++c.min; // gets translated to "c.min = c.min + 1;" and evaluates to c.min called after that call c.min++; // gets translated to "c.min = c.min + 1;" and evaluates to c.min called before that call
// same with other ops unless they are explicitely otherwise defined
---

(And all non-property functions shouldn't be allowed to be called in assign-style or without parentheses.)

Reply via email to