На этом шаге мы рассмотрим функции, осуществляющие чтение из входного источника.
Функции ввода осуществляют считывание информации из текущего входного источника (CIS) и возврат ввода CIS.
Если файл является текущим входным источником (CIS) и если осуществляется попытка считывать данные за пределами файла, возникает прерывание по ошибке "Конец файла" ("End-of-file").
Приведем перечень функций, которые рассматриваются на этом шаге:
Функция | Назначение |
---|---|
Считывает следующий элемент из текущего входного источника (CIS) и возвращает символ, у которого P-имя состоит из этого символа. | |
Восстанавливает последний элемент, считанный из текущего входного источника (CIS), в "верхушке" текущего входного источника и возвращает NIL. | |
Считывает следующий элемент из текущего входного потока (CIS). | |
"Чистит" буфер линейного редактирования. | |
Считывает элементы из текущего входного потока до тех пор, пока не встретится <ENTER>, и возвращает символ, у которого Р-имя состоит из всех считанных элементов, кроме <ENTER>. | |
Возвращает Т, если текущий входной поток содержит элементы, доступные для ввода, в противном случае - NIL. | |
Считывает одно целое выражение из текущего входного потока и возвращает эквивалентный связанный список. | |
Копирует элемент типа CHAR2 в текущую область считывания элемента CHAR1. | |
Считывает элемент из текущего входного источника и возвращает соответствующий атом muLISP. | |
Делает элементы списка LIST символами прерывания. |
Опишем функции ввода в системе muLISP85.
1. Функция (READ-CHAR) считывает следующий элемент из текущего входного источника (CIS) и возвращает символ, у которого P-имя состоит из этого символа. Для удобства программирования символ, возвращаемый функцией READ-CHAR, кроме того, присваивается переменной RATOM. Отметим, что функция READ-CHAR всегда возвращает символ даже если считанный элемент есть десятичное число.
Если PEEK-FLAG не равен NIL, то функция
(READ-CHAR PEEK-FLAG)
так же считывает один элемент, возвращая соответствующий символ, и присваивает его переменной RATOM. Однако элемент, считываемый функцией READ-CHAR, остается в "верхушке" входного потока, который используется функциями READ и RATOM (но не функцией READ-CHAR). Это дает возможность использовать READ-CHAR для того, чтобы "заглядывать вперед" за один элемент, и затем использовать READ или RATOM для считывания этого элемента как части следующего входного потока.
2. Функция (UNREAD-CHAR) восстанавливает последний элемент, считанный из текущего входного источника (CIS), в "верхушке" текущего входного источника и возвращает NIL. Так как может быть восстановлен только последний считанный элемент, то вызов функции повторно без выполнения операции считывания не будет иметь результата.
3. Функция (PEEK-CHAR) считывает следующий элемент из текущего входного потока (CIS).
Функция (PEEK-CHAR T) считывает элементы из до тех пор, пока встречается "непустой" элемент.
Если SYMBOL - символ, то функция (PEEK-CHAR SYMBOL) считывает элементы из текущего входного потока до тех пор, пока не встретится элемент, равный первому символу в Р-имени SYMBOL.
Во всех случаях функция PEEK-CHAR восстанавливает последний считанный из текущего входного потока элемент в "верхушке" CIS и возвращает символ, у которого Р-имя состоит из этого элемента. Для удобства программирования символ, выдаваемый PEEK-CHAR, кроме того, присваивается переменной RATOM.
Функция PEEK-CHAR всегда возвращает символ, даже если последний элемент - число.
4. Если за текущий входной поток берется консоль, и ввод с консоли осуществляется методом линейного редактирования, то функция (CLEAR-INPUT) "чистит" буфер линейного редактирования. Если консоль является текущим входным потоком, и ввод с консоли осуществляется методом примитивного ("грубого") ввода, то функция CLEAR-INPUT чистит буфер примитивного ("грубого") ввода.
В любом случае, функция CLEAR-INPUT возвращает NIL.
5. Функция (READ-LINE) считывает элементы из текущего входного потока до тех пор, пока не встретится <ENTER>, и возвращает символ, у которого Р-имя состоит из всех считанных элементов, кроме <ENTER>.
Функция READ-LINE возвращает строку, точно такую, как она есть, не отбрасывая пустые места или комментарии.
6. Если текущий входной поток содержит элементы, доступные для ввода, то функция (LISTEN) возвращает Т, в противном случае - NIL.
Функция LISTEN используется для определения состояния готовности для элементов текущего входного потока.
Если текущий входной поток - это консоль, то данная функция может использоваться для проверки, является ли элемент доступным для пользователя.
Если текущий входной поток - это исходный файл, то данная функция может использоваться для проверки, достигнут ли конец файла.
7. Функция (READ) считывает одно целое выражение из текущего входного потока и возвращает эквивалентный связанный список. Правильно составленные выражения с использованием либо списковых, либо точечных изображений, либо их комбинаций являются допустимыми входными данными для функции READ.
Пробельные символы сдужат только для разграничения считанных знаков и в противном случае функцией READ игнорируются.
Разграничительные символы могут рассматриваться как часть знаков, считываемых функцией READ.
Простой разграничительный символ определяет границы элемента следующего непосредственно за ним.
Составной разграничительный символ определяет границы элемента между ним и следующим составным разграничительным символом.
Простым разграничительным символом является символ "\", составным - символ "|".
Простой рвзграничительный символ может использоваться для включения простых и составных разграничительных символов в элементы, границы которых определены составными разграничительными символами.
8. Если FLAG не равен NIL, то функция
(COPY-CHAR-TYPE CHAR1 CHAR2 FLAG)
Если FLAG - NIL или отсутствует, то функция копирует элемент типа CHAR2 во взятую по умолчанию область считывания элемента CHAR1.
Если CHAR2 есть макросимвол, то указатель на его макроопределение также копируется в CHAR1.
Если копирование прошло успешно, то функция возвращает Т, иначе - NIL.
9. Функция (RATOM) считывает элемент из текущего входного источника и возвращает соответствующий атом muLISP. Для удобства программирования атом, вызываемый функцией RATOM, определяется как значение переменной RATOM.
Элемент является строкой символов, ограниченной либо пробелами, либо символами прерывания. Функция RATOM возвращает число, если элемент начинается с десятичного числа меньшего, чем текущая основная система счисления. В противном случае функция RATOM возвращает символ. Численные элементы заканчиваются любым символом, не являющимся цифрой основной системы счисления.
Пробельные символы предназначены только для разграничения элементов и не возвращаются функцией RATOM в качестве атомов.
По умолчанию пробельными считаются символы:
<space>, <enter>, <linefeed>, <page> и <tab>.
Символы прерывания также разграничивают элементы, но в отличие от пробельных символов они возвращаются функцией RATOM как символы, входящие в состав элементов.
Символами прерывания являются:
! " # $ % & ' ( ) * + , - . / : < = > ? @ [ \ ] ^ _ ` { | } ~
Функция RATOM распознает простые и составные ограничительные символы в качестве способа включения пробелов и (или) символов прерывания как части элементов потоков. Например:
$ (RATOM) DOG DOG $ (RATOM) 123CAT 123
10. Если FLAG - NIL или отсутствует, то функция
(SET-BREAK-CHARS LIST FLAG)
Если FLAG - не NIL, то функция SET-BREAK-CHARS добавляет символы из списка LIST к текущему множеству символов прерывания.
Функция (GET-BREAK-CHARS) возвращает список текущего множества символов прерывания.
На следующем шаге мы рассмотрим макросимволы, используемые в функциях ввода.