Which language futures make D overcompicated?

Meta jared771 at gmail.com
Fri Feb 9 18:58:39 UTC 2018


On Friday, 9 February 2018 at 17:31:47 UTC, Adam D. Ruppe wrote:
> On Friday, 9 February 2018 at 16:44:32 UTC, Seb wrote:
>> Forget inout, it's seldomly used and there have even attempts 
>> to remove it from the language.
>
> inout rox. I think this is more of a documentation 
> discoverability problem. We should be having people read the 
> spec, which is written toward compiler authors [!], when they 
> want to just know how to use it.
>
> Here's the basic rules of thumb:
>
> If you don't need to change a variable:
>
> 1) use immutable when declaring a new variable
>
> immutable myvar = "never gonna change";
>
> 2) if you are returning a member variable or function argument, 
> use inout on both
>
> class myclass {
>    Object member;
>    inout(Object) getMember() inout {
>        return member;
>    }
> }
>
> inout(char)* identity(inout(char)* s) {
>    return s;
> }

My main issue with inout is the following:

struct Option(T)
{
     bool isNull;
     T payload;

     this(inout(T) val) inout
     {
         payload = val;
     }

     bool opEquals(inout(T) val) inout
     {
         return !this.isNull && (this.get() == val);
     }

     inout(T) get() inout
     {
         return payload;
     }
}

struct InoutHeaven
{
     int n;
}

void main()
{
     immutable Option!InoutHeaven v1 = InoutHeaven(1);
     assert(v1 == InoutHeaven(1));
}

Everything is fine until InoutHeaven defines a custom opEquals:

struct InoutHell
{
     int n;

     bool opEquals(InoutHell other)
     {
         return n == other.n;
     }
}

void main()
{
     immutable Option!InoutHell v1 = InoutHell(1);
     //Welcome to Inout Hell >:^)
     //Error: mutable method onlineapp.InoutHell.opEquals is not 
callable using a inout object
     assert(v1 == InoutHell(1));
}

The really frustrating thing is that as far as I know, there's 
nothing you can do if you don't have control over the wrapped 
type. If you can't add your own inout or const opEquals method, 
you're screwed.

I might be wrong about this though, as I think Steven has 
debunked this on at least one occasion. However, I can't remember 
what his solution was, if there was one.


More information about the Digitalmars-d mailing list