На этом шаге мы рассмотрим функции, осуществляющие ввод и вывод информации.
Устанавливает длину выводимой строки. | |
Выбирает для чтения ранее открытый файл. | |
Выбирает для вывода ранее открытый файл. | |
Осуществляет чтение из файла. | |
Осуществляет чтение из файла. | |
Выводит в файл вычисленное значение аргумента и символ "перевод строки". | |
Выводит в файл значение аргумента без последующего вывода символа "перевод строки". | |
Осуществляет перевод строки. | |
Выводит в файл указанное количество символов "пробел" и возвращает их количество. | |
Управляет выводом в файл текста комментариев. |
1. Функция LINELENGTH имеет один аргумент, который может быть либо числовым атомом, либо атомом NIL.
Если аргументом является число, то функция LINELENGTH устанавливает длину выводимой строки равной этому числу. Если значением аргумента является NIL, то длина строки остается прежней.
В обоих случаях значением функции LINELENGTH является длина выводимой строки
до выполнения функции. Длина строки по умолчанию равна 79. Например:
$ (LINELENGTH 73)
79
$ (LINELENGTH NIL)
73
$ (LINELENGTH 80)
73
В начало таблицы
2. Функция RDS, аргументом которой является S-выражение, выбирает для чтения открытый ранее файл.
Функция WRS, аргументом которой является S-выражение, выбирает для вывода открытый ранее файл.
Функция RDS (WRS) с аргументом NIL производит переключение ввода
(вывода) на стандартное устройство. Для персональных компьютеров этим устройством
обычно является клавиатура (дисплей).
В начало таблицы
3. Непосредственное чтение из файла, уже выбранного последним обращением к функции RDS, осуществляется функциями READ и READCH. Обе эти функции не имеют параметров.
Функция READCH в качестве значения возвращает следующий символ из текущего файла ввода (т.е. файла, выбранного для чтения последним обращением к функции RDS).
Функция READ в качестве значения возвращает лисповское выражение из текущего файла ввода (т.е. файла, выбранного для чтения последним обращением к функции RDS).
Пусть последнее обращение к функции RDS было таким:(RDS). Как только интерепретатор встречает (READ), вычисления приостанавливаются до тех пор, пока пользователь не введет какой-нибудь символ или лисповское выражение. Обратите внимание на то, что READ "молча ждет" ввода выражения. Функция READ "читает" выражение и возвращает в качестве значения само это выражение, после чего вычисления продолжаются.
У приведенного выше вызова функции READ не было аргументов, но у этой функции есть значение, которое совпадает с введенным выражением. По своему действию READ представляет собой функцию, но у нее есть побочный эффект, состоящий именно во вводе выражения. В силу этого, READ является не чистой функцией, а псевдофункцией.
Если прочитанное значение необходимо сохранить для дальнейшего использования, то
вызов READ должен быть аргументом функции присваивания, например, SETQ,
которая свяжет полученное выражение с заданным атомом. Например:
$ (SETQ INPUT (READ))
(PLUS 2 3)
$ INPUT
(PLUS 2 3)
Функция READ совместно с другими функциями позволяют читать выражения внешние по отношению к программе. Из них можно строить новые лисповские выражения или целые программы!
Функция RATOM возвращает введенный с консоли атом (остальное игнорируется).
В начало таблицы
4. Функция PRINT выводит в файл, уже выбранный для вывода последним обращением
к функции WRS, вычисленное значение аргумента и символ "перевод строки". Например:
$ (PRINT "Вывод текста на экран!")
Вывод текста на экран!
Как и функция READ, PRINT является псевдофункцией, у которой есть как побочный эффект, так и значение. Значением функции является значение ее аргумента, а побочным эффектом - печать этого значения.
Отметим, что функции ввода-вывода очень гибки, поскольку их можно использовать в
качестве аргументов других функций. Например:
$ (PLUS (PRINT 2) 3)
2
5
Если мы используем PRINT на самом верхнем уровне, S-выражение печатается дважды. Причиной этого служит то, что функция PRINT (так же, как и READ в подобной ситуации) не только используется для своего действия (печати), но, кроме того, имеет и значение (этим значением служит значение ее аргумента).
Так, если мы присвоим X значение (1 2 3) и напишем (PRINT X) на самом верхнем уровне, первое, что произойдет - это напечатается значение X, что указывается собственно функцией PRINT, т.е. напечатается (1 2 3), а затем LISP-система сделает то, что всегда делает на самом верхнем уровне, - она выведет на печать значение вызванной функции, которое в данном случае есть значение X, т.е. опять напечатается (1 2 3).
Это нежелательное явление, конечно, исчезает, когда PRINT используется нормально, т.е. не на самом верхнем уровне.
Функция PRINT часто используется временно внутри программы для печати промежуточных
результатов в процессе отладки программы.
В начало таблицы
5. Функция PRIN1 выводит в файл, уже выбранный для вывода последним обращением к функции WRS, значение аргумента без последующего вывода символа "перевод строки".
Таким образом, функция PRIN1 действует так же, как и функция PRINT,
но в файл вывода не выводится символ "перевод строки". Например:
$ (PRIN1 1) (PRIN1 2) (PRINT 3)
1 2 3
Как функцией PRINT, так и функцией PRIN1 можно выводить кроме атомов
и списков и другие типы данных, например, строки:
$ (PRIN1 "A B C")
A B CA B C
Вывод информации в такой форме в некоторый файл позволяет функции чтения (READ)
вновь прочесть выведенное выражение в виде, логически идентичном первоначальному.
В начало таблицы
6. Вывод выражений часто желательно разбить на несколько строк. Перевод строки
можно осуществить функцией TERPRI (TERminate PRInting). У функции
TERPRI нет аргументов и в качестве значения она возвращает NIL.
Например:
(PRIN1 A) (TERPRI) (PRINT B) (PRIN1 C)
A
B
C
(PRIN1 X) (TERPRI)
7. Функция SPACES выводит в файл, уже выбранный для вывода последним обращением
к функции WRS, указанное количество символов "пробел" и возвращает их количество.
Синтаксис функции: (SPACES X).
В начало таблицы
8. Системная управляющая переменная ECHO (не функция!) управляет выводом
в файл, уже выбранный для вывода последним обращением к функции WRS, текста
комментариев. Например:
(SETQ ECHO T)
% Текст будет выведен на экран дисплея %
(SETQ ECHO NIL)
% Текст НЕ будет выведен на экран дисплея %
В начало таблицы
На следующем шаге мы познакомимся с управляющей структурой COND.