Uniform Function Call Syntax(UFCS) and @property

Steven Schveighoffer schveiguy at yahoo.com
Thu Mar 3 13:44:18 PST 2011


On Thu, 03 Mar 2011 16:27:37 -0500, Jonathan M Davis <jmdavisProg at 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


More information about the Digitalmars-d mailing list