2.2 Буквы

Буквы символы представляют собой объекты данных, принадлежащих типу буква (character). (Чтобы не возникало путаницы между символами и строковыми символами (буквами), в данном переводе используется слово буквы.)

Объект буквы может быть записан, как знак #\ и последующая буква. Например: #\g обозначает букву g в нижнем регистре. Это работает достаточно хорошо для вывода печатаемых букв. Невыводимые буквы имеют имена, и могут быть записаны с помощью #\ и последующего имени; например, #\Space (или #\SPACE или #\space или #\sPaCE) обозначает символ пробела. Синтаксис для записи имени строкового символа после #\, такой же как и для Lisp символов. Однако в работе могут использоваться только те имена, которые известны данной реализации.

2.2.1 Стандартные буквы

Common Lisp определяет множество стандартных букв (подтип standard-char) для двух целей. Common Lisp программы, которые записаны используя множество букв, могут быть прочитаны любой реализацией Common Lisp; и Common Lisp программы, которые используют только стандартные буквы в качестве объектов данных, скорее всего будут портируемыми. Множество букв состоит из символа пробела, #\Space, символа новой строки #\Newline, и следующих сорока четырёх печатаемых символов и их эквивалентов:

! " # $ % & ’ ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ̂ _
‘ a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

Множество стандартных букв Common Lisp’а явно соответствует множеству из сорока пяти стандартных ASCII печатаемых букв и символа новой строки.

Из сорока четырёх печатаемых символов, следующие используются с ограничениями связанными с синтаксисом Common Lisp программ:

[  ]  {  }  ?  !  ̂  _  ~  $  %

Следующие строковые символы называются слегка стандартизированными:

#\Backspace  #\Tab  #\Linefeed  #\Page  #\Return  #\Rubout

Не все реализации Common Lisp’а нуждаются в поддержке этих букв; но те реализации, что используют ASCII кодировку должны их поддерживать, соответственно BS (восьмеричный код 010), HT (011), LF (012), FF (014), CR (015) и DEL (177). Эти строковые символы не являются членами подтипа standard-char, если не будут созданы синонимы для них. Например, разработчик реализации может определить #\Linefeed или #\Return как синоним для #\Newline, или #\Tab как синоним для #\Space.

2.2.2 Разделители строк

Обработка разделителей строк является одним из самых сложных моментов в проектировании переносимой программы, преимущественно потому, что между операционными системами очень мало соглашений по этому поводу. Некоторые используют только один символ, и рекомендуемый для этого ASCII символ является символом перевода строки LF (также называемый символом новой строки, NL), но некоторые системы используют символ перевода каретки CR. Более широко используется последовательность из двух символов CR и последующем LF. Часто разделители строк не имеют выводимого представления, но неявно влияют на структурирование файла в записи, каждая запись содержит строку текста. Например, дека перфокарт имеет такую структуру.

Common Lisp предоставляет абстрактный интерфейс, требуя наличия одного символа #\Newline, который являет разделителем строк. (Язык C имеет подобное требование.) Реализация Common Lisp’а должна транслировать это односимвольное представление разделители в то, что требуется во внешних системах в данной операционной системе.

Требование того, что разделитель строк должен быть представлен одним символом, имеет следующие последствия. Строковый объект, записанный в середине программы и содержащий несколько строк, должен содержать только один символ для каждого разделителя. Рассмотрим фрагмент следующего кода:

(setq a-string "This string
contains
forty-two characters.")

Между g and c должен быть только один символ, #\Newline; такая последовательность из двух символов, как #\Return и #\Newline некорректна. Такая же ситуация и между s и f.

Когда буква #\Newline записывается в выходной файл, реализация Common Lisp’а должна предпринять соответствующие действия для разделения строк. Это может быть реализовано, как трансляция #\Newline в последовательность CR/LF.

2.2.3 Нестандартные символы

Любая реализация может предоставлять дополнительные буквы, и печатаемые и именованные. Некоторые вероятные примеры:

#\π  #\α  #\Break  #\Home-Up  #\Escape

Использование таких букв, может создавать проблемы для портируемости Common Lisp программы.