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

Reply via email to