Michael G Schwern <[EMAIL PROTECTED]> writes:
> On Fri, Jul 01, 2005 at 07:11:26AM +0000, Smylers wrote:
>> > The question you have to ask yourself is why should a reference be
>> > treated different from any other value? It is a VALUE.
>>
>> Except it isn't. Or at least, not all the time: it depends how you wish
>> to look at it. If you just consider a reference to be a value
>> (effectively a pointer, a memory address) then you aren't examining a
>> data structure _deeply_; you're just doing a _shallow_ comparision of it
>> as a reference.
>
> I think this hits the nail on the head. References are treated differently
> because we don't look at the reference we look at the data that reference
> points to. is_deeply() does this fairly consistently ignoring blessing,
> ties and overloading.
>
> Under the proposed logic, this test fails:
>
> my $a = [];
> my $b = [];
> my $c = [];
>
> my $x = [$a, $a];
> my $y = [$b, $c];
>
> is_deeply($x, $y);
>
> because $x and $y can be altered in exactly the same way yet come out
> differently.
>
> $x->[0][0] = 1; # [[1],[1]]
> $y->[0][0] = 1; # [[1],[]]
>
> There's plenty of other cases where this can happen. If $x is tied. If $x
> is a string overloaded object. If $x is an object. These can lead to
> situations where the same operation is applied to both structures yet
> results in different structures. But we ignore this because is_deeply()
> has to draw a line between internal and external information somewhere.
> Its drawn at the reference value.
>
> is_deeply() is not about exact equivalence. Its about making a best fit
> function for the most common uses. I think most people expect [$a, $a] and
> [$b,$c] to come out equal.
I've always thought of C<is_deeply> as being about the 'shape' of a data
structure. When you think of things in this way, then it seems obvious that
given
$a = [], $b = [], $c = []
then [$a, $a] and [$b, $c] have substantially different shapes.