Шаг 62.
Файлы в muLISP85. Функции входного источника

    На этом шаге мы рассмотрим функции, позволяющие рассматривать устройства, как источники информации.

    Функции ввода и управляющие переменные позволяют программам, написанным на muLISP, считывать и интерпретировать данные из текущего входного источника (CIS).

    Функции входного источника отбирают информацию, имеющую отношение к источнику ввода информации, с помощью функций ввода. Текущий входной источник (CIS) может создаваться либо с консоли, либо из текущего входного файла (CIF).

    Хотя для ввода может быть открыто несколько файлов, только один из открытых входных файлов может быть файлом CIF в каждый конкретный момент времени.

    Приведем перечень функций, которые рассматриваются на этом шаге:

Таблица 1. Функции для работы с источником
Функция Назначение
(RDS drive:name.type)
Ищет файл name.type на устройстве drive.
(INPUTFILE)
Возвращает имя текущего входного файла в виде символа в форме "drive:name.type".
(OPENFILES)
Возвращает список имен открытых в настоящий момент входных и выходных файлов.
(READPTR INTEGER)
Устанавливает указателю чтения текущего входного файла значение INTEGER и возвращает предыдущее значение указателя.

    Опишем функции для работы с текущим входным источником.

    1. Если файл drive:name.type уже не был ранее открыт для ввода и(или) вывода, то функция

    (RDS drive:name.type)
ищет файл name.type на устройстве drive.

    Если файл найден, то функция RDS делает его текущим входным файлом (CIF), устанавливает указатель чтения в нуль, а управляющей переменной RDS присваивает значение drive:name.type. Это превращает файл в текущий входной файл (CIF) и в текущий входной источник (CIS).

    Если файл не найден, то функция RDS не изменяет текущего входного файла CIF, а управляющую переменную RDS полагает равной NIL; за текущий входной источник (CIS) берется консоль.

    Если файл drive:name.type уже был открыт для ввода и(или) вывода, то функция (RDS drive:name.type) делает его текущим входным файлом (CIF) и устанавливает управляющей переменной RDS значение drive:name.type. Это делает файл как текущим входным файлом (CIF), так и текущим входным источником (CIS). Отметим, что данная операция не обеспечивает доступа к диску и что указатель чтения файла не изменяется.

    Если type отсутствует, то функция RDS присваивает типу файла имя "LSP".

    Если отсутствует drive:, то функция RDS выполняет действия, описанные выше, за исключением того, что файл открывается на устройстве, заданном в данный момент по умолчанию.

    Если имеется активный текущий входной файл (CIF), то вызов функции (RDS) закрывает текущий входной файл (CIF) для ввода (но не для вывода, если какие-либо файлы еще открыты на вывод), т.е. активного CIF нет, и устанавливает переменную RDS в NIL; за текущий входной источник (CIS) принимается консоль.

    Пример:

   $ (RDS 'D:ANIMAL)
   D:ANIMAL      ; Файл D:ANIMAL.LSP превращен в CIF

    Обычно функция RDS осуществляет контроль источника для ввода элементов в программы muLISP. Однако после считывания части файла может возникнуть необходимость временно переключиться на ввод с консоли, прервав чтение файла. Такую возможность обеспечивает управляющая переменная RDS.

    После использования функции RDS для открытия файла и установки его в качестве текущего входного файла (CIF), консоль межет стать текущим входным источником (CIS) без изменения CIF посредством присваивания управляющей переменной RDS значения NIL. Последующее значение RDS, отличное от NIL, опять сделает текущий входной файл (CIF) текущим входным источником (CIS), и чтение файла возобновится с того места, на котором оно было приостановлено.

    В начало таблицы

    2. Функция (INPUTFILE) возвращает имя текущего входного файла (CIF) в виде символа в форме "drive:name.type".

    Если drive:name.type - открытый входной файл, то функция

    (INPUTFILE drive:name.type)
возвращает Т, в противном случае возвращается NIL.

    Если .type отсутствует, то тип файла полагается равным "LSP". Если отсутствует drive:, то берется текущее устройство.

    В начало таблицы

    3. Функция (OPENFILES) возвращает список имен открытых в настоящий момент входных и выходных файлов. Каждое имя является символом в форме "устройство:имя.тип".

    В начало таблицы

    4. Если INTEGER есть нуль или положительное целое число, то функция

    (READPTR INTEGER)
устанавливает указателю чтения текущего входного файла значение INTEGER и возвращает предыдущее значение указателя.

    Если INTEGER - ни нуль, ни положительное целое число, то функция (READPTR INTEGER) возвращает текущее значение указателя чтения текущего входного файла.

    Функция (READPTR 'EOF) возвращает размер текущего входного файла в байтах.

    Если текущего входного файла нет, то функция READPTR возвращает NIL.

    Указатель чтения файла определяет то место в файле, откуда будет считываться следующий элемент. Когда функция RDS открывает файл для ввода, то указатель чтения файла устанавливается в 0. Когда элемент из файла считан, указатель чтения файла автоматически увеличивается.

    Отметим, что функция READPRT работает с текущим входным файлом, но не с текущим входным источником, поэтому необходимо, чтобы в качестве текущего входного источника (CIS) выступала консоль.

    Хорошим примером использования функции READPTR является система обучения muLISP. Данная система считывает и выдает на экран тексты уроков, используя функцию READFILE. Так как система должна обеспечивать возможность просмотра предыдущего экрана, то функция READFILE "проталкивает" указатели чтения, отмечающие каждый экран, в стек PRTLST. Если обучающийся хочет посмотреть предыдущий экран, осуществляется вызов функции (READPTR (POP PRTLST)) и указатель чтения сдвигается назад к началу экрана, что позволяет считать и высветить его еще раз.

    В начало таблицы

    На следующем шаге мы перечислим функции ввода.




Предыдущий шаг Содержание Следующий шаг