On Thu, 03 Mar 2011 16:27:37 -0500, Jonathan M Davis <jmdavisp...@gmx.com> wrote:

On Thursday, March 03, 2011 12:32:44 kenji hara wrote:
It seems to me that you think only combination of member-variable like
property and UFCS.
My suggestion is consider global-variable like property as well.
example:
  @property int global_var(){...}  // getter, int n = global_var;
  @property void global_var(int n){...}  // setter, global_var = 10;

I think that global variable like setter function and member-variable
like getter function occur ambiguity.
Getter and Setter are the opposite meaning.

I'd strongly argue that global/module properties make no sense. What are they a property of? The module? The whole idea with properties in the first place was to be an abstraction of member variables. And since you really shouldn't be using mutable global/module variables anyway, the benefit of such a "property" is already limited. And if they cause ambiguity (as they obviously do), then that's
one more reason to disallow them.

I think global properties are certainly valid. You can have a global field, why not a global property?

The classic example is a singleton:

class Singleton
{
   private this() {}  // disable public construction
   private Singleton _instance;
@property public static Singleton instance() {if(!_instance) _instance = new Singleton; return _instance;}
}

Note that instance has no 'this' pointer. However, it obviously does not have the ambiguities of UFC properties. However, I find the statement that a property must be a member variable very incorrect.

I am sure there are good use cases for global (TLS) variables that are properties. In fact, I use one in druntime. The LRU cache for array appending is a per-thread array, and it *must* be allocated outside any scannable location (not in TLS or GC heap). Therefore, I malloc it. However, I malloc it on the first append. But this is hidden by a property.

The main reason for doing it this way is because originally it was stored in TLS as a fixed-size array. However, that meant any cached memory blocks that were appended to would be kept in memory by the cache. I used the fixed array directly in many places in the file, so the easiest change was to make it a property. It works quite well actually. If we can ever mark sections of TLS as non-scannable, then I can easily change it back from a property to a field.

See https://github.com/D-Programming-Language/druntime/blob/master/src/rt/lifetime.d#L382

-Steve

Reply via email to