Possible @property compromise
Zach the Mystic
reachBUTMINUSTHISzach at gOOGLYmail.com
Fri Feb 1 09:27:58 PST 2013
On Friday, 1 February 2013 at 16:24:53 UTC, Michel Fortin wrote:
> On 2013-02-01 15:54:14 +0000, "Zach the Mystic"
> <reachBUTMINUSTHISzach at gOOGLYmail.com> said:
>
>> And there is simply no need for a data-less struct to allow a
>> "this" pointer. There will never be any need to know the
>> address of a data-less struct. Any use of it will simply give:
>> "Error: a struct with no data may not contain a 'this'
>> pointer". And any use requiring taking its address is
>> statically disallowed at compile time. This is not a hard
>> feature to implement.
>
> I think what Steven is saying is that you're distorting the
> concept of a struct beyond recognition.
Yes, this is exactly what I am trying to do, because it's yet
another totally badass thing to do. But I'm simply adding it to
D's list of such things - CTFE, enums as manifest constants(?),
the reuse of keyword static all over the place, strings as
immutables. Am I wrong?
> What you really want/need is just some kind of namespace inside
> the outer scope.
>
> Note that D almost has what you want already if you do it
> through a template mixin:
> http://www.digitalmars.com/d/archives/digitalmars/D/properties_using_template_mixins_and_alias_this_87952.html
>
> The only thing missing is opGet or an equivalent, and probably
> a more straightforward syntax. And perhaps someone should check
> whether the functions can be made virtual too (another
> requirement that doesn't really belong in a struct).
That's why it's so weird to see people suggesting so many ideas
for @property, when this functionality is basically already built
into the language. My suggestion already works at module level.
Look:
import std.traits;
Front front;
struct Front
{
ref T opCall(T)(T[] a)
if (!isNarrowString!(T[]) && !is(T[] == void[]))
{
assert(a.length, "Attempting to fetch the front of an empty
array of " ~ typeof(a[0]).stringof);
return a[0];
}
}
int main(string[] args)
{
assert([1,2,3].front == 1);
return 0;
}
It needs three improvements:
1) allow it to work everywhere, not just module level
2) make it look good with a new friendly syntax, which by the way
I'm more proud of than any other suggestions I've made here
3) optimize away the unnecessary hidden pointers
More information about the Digitalmars-d
mailing list