каково точное значение для цитируемого символа в lisp? - PullRequest
1 голос
/ 22 февраля 2011
(message "%s" 'abc)
(message "%s" "abc")

Я обнаружил, что оба предыдущих выражения будут иметь одинаковый результат (в emacs).Хотя я знаю, что это не совсем хороший пример, чтобы показать мой вопрос.

Не могли бы вы объяснить подробнее, каково точное значение символа в кавычках?А что возвращает цитируемый символ?Строковое представление имени переменной или что-то еще?

Ответы [ 5 ]

5 голосов
/ 22 февраля 2011

Самый простой ответ: символ уникален в системе, а строка - нет. Следующий тест прояснит суть:

? (eq 'abc 'abc) 
T 
? (eq "abc" "abc")
NIL

Символ интернирован только один раз в системе. Все дальнейшие ссылки указывают на один и тот же объект. Другими словами, символ - это одиночка, а сравнение двух символов - это просто сравнение указателей. Так быстрее. Это не относится к строкам. В приведенном выше примере два экземпляра строки "abc" являются двумя объектами.

3 голосов
/ 22 февраля 2011

Символы в Лиспе могут служить нескольким целям, включая, но не ограничиваясь этим:

  • простой тип данных для представления чего-либо атомарного, что другие простые типы данных не могут или не должны - таким образом, аналогичноперечисления в языках семейства CНапример, функция MakeWidget может принимать аргумент Size, возможные значения которого - «маленький», «средний» и «большой».Символы, используемые таким образом, не нужно объявлять, хотя существуют простые способы ограничения диапазона значений, если это необходимо.
  • имя переменной
  • имя функции

AСимвол в кавычках возвращает сам символ.

Символ может быть напечатан и, как вы видели, печатает как строка.

Итак, почему вы хотите использовать символ, когда выможет так же легко использовать строку?

  • имя символа не изменяется, поэтому он использует меньше памяти, чем строка
  • символ может использоваться для хранения ссылкик функции, которую вы хотите вызвать нетривиальным способом.Типичным примером является применение функции к списку - например, если квадрат является правильно определенной функцией, то:

(apply #'square '(1 2 3 4))

возвращает

(1 4 9 16)

Существуют и другие варианты использования символов, не упомянутых здесь, но, надеюсь, это даст вам хорошее начало.

2 голосов
/ 22 февраля 2011

Цитата просто отключает оценку в указанной вами форме.То, что это делает, будет меняться в зависимости от того, какой шрифт вы используете и что цитируете.

Оценка символа обычно включает поиск значения этого символа.Цитирование символа отключит этот поиск, что означает, что сам символ возвращается.Печать символа печатает имя символа, поэтому вы получаете одинаковый вывод из двух примеров.

1 голос
/ 20 августа 2011

Чтобы добавить к тому, что написано выше:

И строки, и символы могут быть «уникальными» (то, что было сказано выше, неверно).Это объекты с идентичностью.

(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.

1 голос
/ 22 февраля 2011

Символ в кавычках соответствует самому символу.

Символ имеет имя (среди прочего, например, значение). Если вы печатаете символ, его имя печатается.

...