Доклад: Форматированный ввод
_%(a %b c)
(A (QUOTE B) C)
Таблиц чтения может быть несколько, но процедура чтения использует в каждый момент времени лишь одну таблицу. Текущая таблица сохраняется как значение системной переменной *READTABLE*.
Встроенными макросами чтения в Коммон Лиспе являются:
( ; начинает ввод списка или точечной пары
) ; заканчивает ввод списка или точечной пары
' ; возвращает очередное выражение в виде вызова QUOTE
; ; символы до конца строки считаются комментарием
\ ; выделение одиночного специального знака
| ; выделение нескольких специальных знаков
; |…|
“ ;строка: “…”
Макрознаки нельзя использовать в составе символов наподобие обычных знаков, поскольку процедура чтения проинтерпретирует их в соответствии с таблицей как макросы чтения. Для включения таких знаков в состав имен нужно использовать специальные выделяющие знаки: |, \, которые блокируют макрообработку знаков.
ПРИМЕРЫ
Чтение строки
Вводим предложение, заканчивающееся вопросительным или восклицательным знаком, и преобразуем его в список:
(defun readf_ ()
(let ((word (read)))
(cond ((eq word ‘?) ‘(?))
(t (cons word (readf_))))))
Ввод в режиме EVALQUOTE
Функция READ, которая вводит вызов функции в виде: fn(a1 a2 … an) и возвращает значение вызова
(defun readq_ ()
(eval (cons (read) (read))))