Простые типы данных, которые были описаны ранее само вычислялись. То есть при вводе любого объекта этих типов в командную строку Scheme результат вычисления совпадал с тем, что вы ввели.
#t => #t 42 => 42 #\c => #\c
Символы ведут себя иначе, потому что символы используеются программами как идентификаторы переменных, следовательно вычисляются с результатом, который хранится в переменной. Не смотря на это, символы это простой тип данных, обладающий всеми возможностями такого типа: Scheme может передавать их наряду с char'ами, числами и пр.
Чтобы указать интерпретатору на то, что вы вводите символ, а не переменную, нужно взять символ в «цитату» (quote):
(quote xyz) => xyz
Так как такое цитирование встречается часто, удобно использовать короткую версию:
'E
Scheme воспримет это также, как
(quote E)
Именами символов в Scheme могут быть только последовательности знаков. Единственное ограничение на имена символов - чтобы эти имена нельзя было спутать с другими данными, например, char, boolean, number, или структурами. Таким образом, this-is-a-symbol, i18n, ⇔, и $!#* - символы; 16, -i (комплексное число!), #t, «this-is-a-string», и (barf) (a list) - не могут быть символами. Проверочная функция для символов - symbol?:
(symbol? 'xyz) => #t (symbol? 42) => #f
Символы в Scheme обычно регистро-независимые. Так что символы Calorie и calorie одинаковы:
(eqv? 'Calorie 'calorie) => #t
Мы можем использовать символ xyz в качестве глобальной переменной с помощью конструкции define:
(define xyz 9)
Этот код заносит значение 9 в символ xyz. Если мы попытаемся вычислить xyz в командной строке, то результатом будет значение в xyz:
xyz => 9
Мы можем использовать конструкцию set! для изменения значения, которое принимает переменная:
(set! xyz #\c)
После вычисления получаем:
xyz
=> #\c