On Thursday, 21 February 2013 at 23:17:53 UTC, Stewart Gordon wrote:
On 20/02/2013 20:32, Jonathan M Davis wrote:
On Wednesday, February 20, 2013 20:41:24 Rob T wrote:
The reality is that I often don't know if I'll be using one
syntax over the other until usage experience is gained and the
usage context determines the answer. I may even want to use both
forms depending on the use context.

I don't understand this. You make it a property function if it's intended to be used as if it were a variable. If it's not, then you don't mark is a
property. Done. Where's the confusion?
<snip>

I entirely agree. I don't have as much time to read the 'groups as I used to, so haven't managed to follow all the discussions about it.

It's hard to say what are the main advantages of @property over making every function with zero or one parameter usable as a property. But I've come to like it since it was introduced. And it's useful not only to programmers, but also to documentation generators.

In any case, some of the suggestions seem worse than what we had before @property....

Perhaps the only change I'd vote for is dropping the @, which doesn't seem to mean anything.

Stewart.

I was the author of the idea of using structs as properties. Description here: http://forum.dlang.org/thread/[email protected]

I believe that while their advantage comes from their power and flexibility, their disadvantage is a slight syntactic overhead. With Phobos standard formatting, the following two randomly selected properties:

@property size_t length() nothrow pure const @safe
{
    return impl ? impl.nodes : 0;
}

@property bool empty() nothrow pure const @safe
{
    return length == 0;
}

... would become:

length struct
{
    size_t opGet() nothrow pure const @safe
    {
        return impl ? impl.nodes : 0;
    }
}

empty struct
{
    bool opGet() nothrow pure const @safe
    {
        return length == 0;
    }
}

With my syntax, a one-line getter requires the line to be longer by seven characters:

@property size_t length() { return impl.length; }

versus:

length struct { size_t opGet() { return impl.length; } }

Taking this into consideration, and if people have no more creative uses for properties than as getters and setters (i.e. they didn't need or want the full power of structs), I could well see:

@get size_t length() nothrow pure const @safe { return impl ? impl.nodes : 0; }

@set size_t length(size_t) { return impl.length = size_t; }

...as better looking and more precise than:

@property size_t length() nothrow pure const @safe { return impl ? impl.nodes : 0; }

@property size_t length(size_t) { return impl.length = size_t; }

Of course, I don't want to abandon structs as properties. Of course I am biased, but my ideal solution would be for the @get and @set properties above to be syntax sugar for:

length struct
{ size_t opGet() nothrow pure const @safe { return impl ? impl.nodes : 0; } }

length struct
{ size_t opSet(size_t) @safe { return impl.length = size_t; } }

Unfortunately, this would cause a duplicate declaration, and you'd be forced to do this:

length struct
{
size_t opGet() nothrow pure const @safe { return impl ? impl.nodes : 0; }
    size_t opSet(size_t) @safe { return impl.length = size_t; }
}
...when you had more than one overload. But the latter one is better organized and looks nicer, so I personally wouldn't mind converting this way.

(note: 'opSet' is intended to be a natural and better looking alias to the eventually deprecated 'opAssign'. 'opOpSet' replaces 'opOpAssign', etc. This is my ideal world we're talking about here.)

Reply via email to