Do symbols need to be EQ?

Anton Vodonosov avodonosov at yandex.ru
Fri Jul 3 21:49:30 UTC 2015


03.07.2015, 15:45, "Martin Simmons" <martin at lispworks.com>:
>>>>>>  On Fri, 03 Jul 2015 12:15:32 +0300, Anton Vodonosov said:
>>  Envelope-From: avodonosov at yandex.by
>>
>>  I want to correct myself. Unlike numbers or any other objects,
>>  symbols _are_ about names, so we can say that the name CL-USER::FOO
>>  represents the "nature" of symbol.
>>
>>  I think Common Lisp wants to save memory and speedup comparison,
>>  so when we use the same name we get the same object, as implemented
>>  by INTERN (this trick even has name - the Flyweight pattern).
>>
>>  So, this is just an optimization trick, and UNITERN is a maintenance,
>>  system tool, not designed to express programs. We are encouraged to
>>  operate as if the symbol name means the same object.
>
> I disagree about it being to save memory -- a CL symbol is an object with
> mutable attributes, so identity is important.

This is part of the optimization. Functions like SYMBOL-VALUE, GET could
be, for example, backed by hash maps from symbol name, thus returning
the same value for equally named symbols.

I mean on the level of abstraction mathematicians use when they say
"let X = 10" it means that the textual name X is bound to 10.
In Common Lisp it means that the symbol object with name X is bound to 10.

So, in general, abstract sense, symbols need not to be EQ.
But Common Lisp distinguishes symbols up to their object instance identity.
I still suppose this choice is an optimization.

> Also, the identity of uninterned symbols is just as important (e.g. for macros)
> as interned ones

I think if symbols were compared by their names instead of EQ, the
were ways to satisfy needs of macros. But that would be another language,
not CL.

Best regards,
- Anton



More information about the pro mailing list