What's the story with -property?

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Sat Jun 27 17:36:41 PDT 2015


On Sunday, 28 June 2015 at 00:25:47 UTC, Jonathan M Davis wrote:
> [snip]
> it's an open question as to whether any kind of property 
> enforcement will ever be in

I should probably note that a long term consequence of not having 
full property enforcement is that whether parens are used or not 
in generic code is going to be a problem. For, instance,

     template isInputRange(R)
     {
         enum bool isInputRange = is(typeof(
         (inout int = 0)
         {
             R r = R.init;     // can define a range object
             if (r.empty) {}   // can test for empty
             r.popFront();     // can invoke popFront()
             auto h = r.front; // can get the front of the range
         }));
     }

requires that empty and front be called without parens, which 
means that front and empty can be enums or variables or anything 
else which is going to fit the syntax in the code above and not 
just functions. So, you can't _ever_ be calling front or empty 
with parens in generic code if you want your code to work with 
ranges in general rather than the small set of ranges that you 
might be using at the moment. But the compiler doesn't enforce 
that right now at all. It just enforces that the ranges 
themselves be such that front and empty be usable without parens.

In addition, it requires that popFront be used _with_ parens, but 
the only case where it would break code if you didn't would be if 
someone had declared popFront as callable rather than a function, 
since using it without parens as a function would work - but not 
as callable. Now, realistically, pretty much no one is going to 
do that, but technically, according to the API requirements, it's 
perfectly legitimate to do so, and the compiler doesn't protect 
against anyone from writing code which calls popFront without 
parens.

Full property enforcement would fix these issues, but we're never 
going to get it. So, we will always have to worry about generic 
code which uses parens where it shouldn't or doesn't use them 
where it should. How big an issue this will be is an open 
question, but being lax with syntax (like we are with parens on 
functions) doesn't jive well with generic code, so it's something 
that we're going to have to watch out for.

- Jonathan M Davis


More information about the Digitalmars-d mailing list