> Paul Graham offers this excellent explanation for the symbol type:
> "Symbols are effectively pointers to strings stored in a hash table.
> So you can test equality by comparing a pointer, instead of comparing
> each character." [1]
> Of course, he's talking about symbols inLisp, but what he says
> applies equally well to Ruby and Smalltalk.
I find this a little too implementation-centric a description.
The key aspect of symbols is that two symbols are identical if they are equal.
The fact that there may (or may not be) a hash table used to ensure
this is irelevant.
And that description really misses the boat as far asLispis
concerned.Lispsymbols aren't strings, they are really names to which
three (separate) things can be bound, a value (which can be anyLisp
object), a function, and a property list. Actually the name is also
one of the slots in a symbol.
Actually it's five in Common Lisp: Value, Function, Name, Property
List, Package.
Note that inLispthe value of a Symbol is separate from it's name,
and two Symbols can have the same value, they just can't have the same
name.
No, that's wrong. Two different symbols can have the same name in
Common Lisp.
CL-USER 30 > (eq '#:foo '#:foo)
NIL
CL-USER 31 > (symbolp '#:foo)
T
CL-USER 32 > (symbol-name '#:foo)
"FOO"
So inLispa symbol is more like an entry in the table of global names.
No. In Lisp a symbol is a data structure with above five (virtual)
slots.
Symbols can exist without a 'table of names'. These 'table of names'
are called packages. A symbol can belong to a package. You can then
lookup the symbol via the package by its name. Again a symbol
can exist without being interned in a package.
Symbols in Ruby and Smalltalk are more alike than Symbols inLisp.
Smalltalk and Ruby symbols have unique 'values' which are also their 'names'.
These are a bit keyword symbols in Lisp. All symbols that belong to
the keyword package
have themselves as the value.
CL-USER 30 > (eq '#:foo '#:foo)
NIL
CL-USER 31 > (symbolp '#:foo)
T
CL-USER 32 > (symbol-name '#:foo)
"FOO"
CL-USER 33 > :foo
:FOO
CL-USER 34 > (symbol-package :foo)
#<The KEYWORD package, 0/4 internal, 9284/32768 external>
CL-USER 35 > (eq :foo (symbol-value :foo))
T
CL-USER 36 > (describe ':foo)
:FOO is a SYMBOL
NAME "FOO"
VALUE :FOO
FUNCTION #<unbound function>
PLIST NIL
PACKAGE #<The KEYWORD package, 0/4 internal, 9284/32768
···
On Mar 7, 6:17 pm, "Rick DeNatale" <rick.denat...@gmail.com> wrote:
On 3/6/07, Luciano Ramalho <rama...@gmail.com> wrote:
Most Smalltalk implementations make Symbol a subclass of String,
although I'm pretty sure that we didn't require this when we wrote the
X3J20 ANSI Smalltalk spec (We didn't require much if any particular
inheritance hierarchy). Ruby does not treat Symbols as Strings,
although one can obtain an instance of either from an instance of the
other.
Not long ago Matz experimented with the idea of making Symbol a
subclass of String in 1.9, but this appears to have been dropped in
more recent versions.
--
Rick DeNatale