
2.3. Символьные данные
147
нужно рассматривать буквально как строку символов. Например, первая буква «Джо-
на» — разумеется, «Д». Если мы говорим кому-то «скажите, как Вас зовут», мы ожидаем
услышать имя этого человека. Если же мы говорим кому-то «скажите “как Вас зовут” »,
то мы ожидаем услышать слова «как Вас зовут». Заметьте, как, для того, чтобы описать,
что должен сказать кто-то другой, нам пришлось использовать кавычки
32
.
Чтобы обозначать списки и символы, с которыми нужно о бращаться как с объектами
дан ных, а не как с выражениями, ко торые нужно вычислить, мы можем следовать тому
же обычаю. Однако наш формат кавычек отличается от принятого в естественных языках
тем, что мы ставим знак кавычки (по традиции, это символ одинарной кавычки ’)
только в начале того объекта, который надо закавыч ить. В Scheme это сходит нам с рук,
поскольку для разделения объектов мы полагаемся на пробелы и скобки. Таким образом,
значением одинарной кавычки является требование закавычить следующий объект
33
.
Теперь мы можем отли чать символы от их значений:
(define a 1)
(define b 2)
(list a b)
(1 2)
(list ’a ’b)
(a b)
(list ’a b)
(a 2)
Кроме того, кавычки позволя ют нам вводить составные объекты, используя обычное
представлен ие для печати списков:
34
.
32
Когда мы разрешаем в языке кавычки, это разрушает нашу способность говорить о языке в простых тер-
минах, поскольку становится неверным, что равнозначные выражения можно подставлять друг вместо друга.
Например, три есть два плюс один, но слово «три» не есть слова «два плюс один». Кавычки являются мощным
инструментом, поскольку они дают нам способ строить выражения, которые работают с другими выражени-
ями (как мы убедимся в главе 4, когда станем писать интерпретатор). Однако как только мы разрешаем в
языке выражения, которые говорят о других выражениях того же языка, становится очень сложно соблюдать
в каком-либо виде принци п «равное можно заменить равным». Например, если мы знаем, что утренняя и ве-
черняя звезда — одно и то же, то из утверждени я «вечерняя звезда — это Венера» мы можем заключить, что
«утренняя звезда — это Венера». Однако если нам дано, что «Джон знает, что вечерняя звезда — это Венера»,
мы не можем заключить, что «Джон знает, что утренняя звезда — это Венера».
33
Одинарная кавычка отличается от двойной, которую мы использовали для обозначения строк, выводимых
на печать. В то время как одинарную кавычку можно использовать для обозначения списков символов, двойная
кавычка используется только со строками, состоящими из печатных знаков. Единственное, для чего такие
строки используются в нашей книге — это печать.
34
Строго говоря, то, как мы используем кавычку, нарушает общее правило, что все сложные выражения
нашего языка должны отмечаться скобками и выглядеть как списки. Мы можем восстановить эту закономер-
ность, введя особую форму quote, которая служит тем же целям, что и кавычка. Таким образом, мы можем
печатать (quote a) вместо ’a и (quote (a b c)) вместо ’(a b c). Именно так и работает и нтерпрета-
тор. Знак кавычки — это просто сокращение, означающее, что следующее выражение нужно завернуть в форму
quote и получить (quote hвыражениеi). Это важно потому, что таким образом соблюдается принцип, что
с любым выражением, которое видит интерпретатор, можно обращаться как с объектом данных. Например,
можно получить выражение (car ’(a b c)), и это будет то же самое, что и (car (quote (a b c))),
вычислив (list ’car (list ’quote ’(a b c))).