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


If the annotation (attribute) proposal is adopted (see DIP 6) then property can be considered a compile-time annotation (attribute) and no new global keyword is required.

@property @pure @const @nothrow bool empty() { ... }

or

attribute(property,pure,const,nothrow) bool empty() { ... }

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.

What do you think?

Ugly :)

Reply via email to