Edi Weitz
2015-07-03 07:09:26 UTC
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?
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?