May 30, 2013
On 2013-05-30, 13:56, Shriramana Sharma wrote:

> Hello. I have always loved the readability of C++'s and/or/not/xor
> word-like logical operators but It doesn't seem to be available in D.
> Isn't this possible in D? I tried doing:
>
> alias && and ;
> import std.stdio ;
> void main () {
> 	writeln ( true and true ) ;
> }
>
> but I get errors:
>
> $ dmd foo.d
> foo.d(1): Error: basic type expected, not &&
> foo.d(1): Error: no identifier for declarator int
> foo.d(1): Error: semicolon expected to close alias declaration
> foo.d(1): Error: Declaration expected, not '&&'
> foo.d(7): Error: found 'and' when expecting ',
>
> Thanks.

While that's not possible, D's operator overloading allows you to
implement it yourself:

struct And {
    struct AndImpl {
        private bool payload;
        this( bool value ) {
            payload = value;
        }
        bool opBinary(string op : "/")(bool value) const {
            return payload && value;
        }
    }
    AndImpl opBinaryRight(string op : "/")(bool value) {
        return AndImpl( value );
    }
}

struct Or {
    struct OrImpl {
        private bool payload;
        this( bool value ) {
            payload = value;
        }
        bool opBinary(string op : "/")(bool value) const {
            return payload || value;
        }
    }
    OrImpl opBinaryRight(string op : "/")(bool value) {
        return OrImpl( value );
    }
}

And and;
Or or;


void main( ) {
    assert( true /and/ true );
    assert( true /or/ false );
}

Of course, if you ever use this, watch out for the flood of WTFs
and curse words.

-- 
Simen