Чтобы добавить к тому, что написано выше:
И строки, и символы могут быть «уникальными» (то, что было сказано выше, неверно).Это объекты с идентичностью.
(setq foo "abc")
(setq bar foo)
(eq foo bar)
Значения переменных foo
и bar
являются одной и той же (уникальной) строкой.
Причина, по которой (eq "abc" "abc")
не является nil
, заключается в том, что средство чтения Lisp создает два разных строковых объекта из этих двух строковых выражений.С другой стороны, когда читатель Lisp встречает только abc
, он читает его как имя символа.Он (как было сказано выше) в первый раз интернирует символ с таким именем и просматривает имя символа после этого.
По оценке:
Строки являются самостоятельнымипроцитировать;то есть они оценивают для себя.Большинство символов не являются (t
и nil
являются заметными исключениями).
Во время оценки ищется символ, чтобы получить (а) свою связанную функцию, если ониспользуется в контексте в качестве функции или (b) связанного с ней значения, если оно используется в контексте в качестве переменной.
В (abc xyz)
:
Символ abc
используется в контексте как функция, поэтому его функция ищется и используется (значение его функции "ячейка").
Символ xyz
используется в контексте как переменная, поэтому ее значение переменной ищется и используется (значение ее переменной "cell").
IOW, символы в Emacs Lisp имеют два«ячейки» или значения: (а) как функция, (б) как переменная.Данный символ может быть неопределенным как переменная или как функция, или он может иметь оба вида определения.
Наконец, сказать, что (message "%s" "abc")
имеет то же значение, что и (message "%s" 'abc)
, является искажением, вусловия того, что вы имели в виду.Они оба возвращают одно и то же значение , равное nil
, и оба имеют одинаковый эффект , который должен печатать abc
.