Better distinguishing reference and value in the syntax?

Chad J chadjoan at __spam.is.bad__gmail.com
Mon Jan 2 22:46:40 PST 2012


On 01/03/2012 12:10 AM, Gou Lingfeng wrote:
> On Mon, 2012-01-02 at 13:18 +0100, Alex Rønne Petersen wrote:
>> On 02-01-2012 06:25, Gou Lingfeng wrote:
>>> D's definitions of "is" and "==" have so much redundency. That might
>>> indicate some flaw. If references and values (for classes and arrays)
>>> could be clearly distinguished in the syntax, the "is" operator is not
>>> necessary at all.
>>
>> Of course it is. 'is' is strictly identity, while == would call an 
>> overloaded opEquals, if any exists. This difference in semantics is 
>> *very* important when you do *not* want to call opEquals.
> 
> My impression is that, in D, references are wrapped (protected)
> pointers, and there are values behind. Although opEquals can be defined
> anyway, it's usually some function depending on the values, not
> pointers. If we could clearly show whether we wan't pointer comparison
> or value comparison, then "a is b" would be "pointer(a)==pointer(b)",
> and "a==b" "value(a)==value(b)".
> 
> Or "is" sould evaluate false for "int is int", and true or false for
> expressions like "int is (ref int)" and "(ref int) is (ref int)". So it
> has a consistant meaning everywhere: whether a and b refer to exactly
> the same memory location. And there's no redundency.
> 
> 

Sortof.  There are shortcomings to thinking about it that way ;)

Here's my take:

'is' is the /identity/ operator.  It is true when the two operands hold
the same thing, the same instance.
'==' is the /equality/ operator.  It is true when the two operands hold
things which are equivalent.

Here is an example:

import std.stdio;

void main()
{
        string str1 = "foo";
        string str2 = str1.idup;
        if ( str1 == str2 )  writeln("str1 == str2");
        if ( str1 !is str2 ) writeln("str1 !is str2");
}

It should print this:
str1 == str2
str1 !is str2

In this case the strings are equal because they share the same contents,
but they are not identical because they are different (instances of)
strings.



More information about the Digitalmars-d mailing list