В схеме и ракетке символ похож на неизменную строку, которая оказывается интернированной, так что символы можно сравнивать с eq?
(быстрое, по существу, сравнение указателей).Символы и строки являются отдельными типами данных.
Одно из применений символов - упрощенные перечисления.Например, можно сказать, что направление: 'north
, 'south
, 'east
или 'west
.Конечно, вы можете использовать строки для той же цели, но это будет немного менее эффективно.Использование чисел было бы плохой идеей;представлять информацию как можно более наглядно и прозрачно.
В другом примере SXML - это представление XML с использованием списков, символов и строк.В частности, строки представляют символьные данные, а символы представляют имена элементов.Таким образом, XML <em>hello world</em>
будет представлен значением (list 'em "hello world")
, которое можно записать более компактно '(em "hello world")
.
Другое использование символов - это ключи.Например, вы можете реализовать таблицу методов в виде словаря, отображающего символы в функции реализации.Чтобы вызвать метод, вы ищите символ, который соответствует имени метода.Lisp / Scheme / Racket делает это действительно простым, потому что язык уже имеет встроенное соответствие между идентификаторами (часть синтаксиса языка) и символами (значениями в языке).Это соответствие облегчает поддержку макросов , которые реализуют пользовательские синтаксические расширения языка.Например, можно реализовать систему классов как библиотеку макросов, используя неявное соответствие между «именами методов» (синтаксическим понятием, определенным системой классов) и символами:
(send obj meth arg1 arg2)
=>
(apply (lookup-method obj 'meth) obj (list arg1 arg2))
(В других Лиспах,то, что я сказал, в основном верно, но есть еще кое-что, о чем нужно знать, например, пакеты и функции в сравнении со слотами переменных, IIRC.)