Do symbols need to be EQ?

Edi Weitz edi at weitz.de
Fri Jul 3 07:53:19 UTC 2015


Let me repeat: I'm not concerned about whether this could impede my
ability to write CL programs nor am I concerned that some future
implementor might not do the right thing.  I just can't see the
internal logic (and the CLHS seems otherwise mostly very clear and
logical to me).

The standard actually defines the word "same" and says that two
objects are the same if they can't be distinguished by EQL (unless
another predicate is explicitly mentioned).  But let's forget about
this definition (although it is hard to talk about such concepts if
you can't use certain words).  I'm more concerned with object
identity:

1. I guess we all agree that there's one and only one mathematical
object which is the number 536870912.

2. We also all know that on some 32-bit implementations (EQ 536870912
536870912) can yield NIL while (EQL 536870912 536870912) must yield T.

3. So EQL is the preferred predicate in the standard and is intended
to mean that two things are _semantically_ identical although they
might _technically_ be different (like above).

4. EQ on the other hand tests whether its arguments are (according to
the CLHS) "the same, identical object."  I've always understood this
as a test for identity at the implementation level I shouldn't be
concerned with.  (Leaving the question open why EQ is in the standard
at all...)

5. Now, and I think this is the crucial part, by using EQ to compare
symbols in various parts of the standard, I take this as a suggestion
that there is for example one and only one symbol CL-USER::FOO like
there is one and only one number 536870912.  Even more so, because
they use EQ and not EQL they also suggest - it seems to me - that this
one and only one symbol must have one and only internal
representation.

6. But if you agree with #5 and then look at my UNINTERN example how
do you explain the results?  Has the symbol which once was
CL-USER::FOO and is still stored in *S* lost its identity?  There are
plenty of operations which modify objects - like (SETF GETHASH) - but
none of them causes the object to lose its identity.

I guess I could rephrase my question like this: Wouldn't it be clearer
if "sameness" of symbols would be defined via EQL with something like:
"Two symbols are EQL if their names are the same under STRING= and
their home packages are the same under EQL." (And maybe some more
sentences if necessary.)



On Fri, Jul 3, 2015 at 9:16 AM, Anton Vodonosov <avodonosov at yandex.ru> wrote:
> I think the most confusing part is what you mean by "same" symbols.
>
> 03.07.2015, 10:10, "Edi Weitz" <edi at weitz.de>:
>> Just out of curiosity and without any relevance in practise:
>>
>> Is there one place in the standard where it is explicitly said that
>> two symbols which are the "same" symbol must be "identical"? I know
>> that there are a couple of examples where this is implied, but
>> formally the examples aren't part of the standard, right?
>>
>> The EQ dictionary entry for example shows this example:
>>
>>   (eq 'a 'a) => true
>>
>> and then it continues with this note (emphasis mine): "Symbols that
>> print the same USUALLY are EQ to each other because of the use of the
>> INTERN function."
>>
>> And the entry for INTERN is actually the closest I could find in terms
>> of clarification because it says that if a symbol of a specified name
>> is already accessible, _IT_ is returned -- which sounds like object
>> identity to me.
>>
>> But how does this fit into the picture?
>>
>>   CL-USER 1 > (defparameter *s* 'foo)
>>   *S*
>>   CL-USER 2 > (unintern 'foo)
>>   T
>>   CL-USER 3 > (defparameter *s2* 'foo)
>>   *S2*
>>   CL-USER 4 > (eq *s* *s2*)
>>   NIL
>>
>> *S* has lost its home package and is thus not EQ to *S2*, sure, but
>> how do we explain this in terms of object identity? Has the UNINTERN
>> operation changed the identity of *S* which once was the one and only
>> CL-USER::FOO but can't be anymore because this role is now occupied by
>> *S2*?
>>
>> Did I miss some clarifying words in the standard? Did I just manage
>> to confuse myself?
>>
>> Thanks,
>> Edi.
>>
>> PS: The UNINTERN entry warns about side effects which could harm
>> consistency, so maybe this is what they meant?
>



More information about the pro mailing list