Учебники

LISP — вход и выход

Common LISP предоставляет множество функций ввода-вывода. Мы уже использовали функцию форматирования и функцию печати для вывода. В этом разделе мы рассмотрим некоторые из наиболее часто используемых функций ввода-вывода, представленных в LISP.

Функции ввода

В следующей таблице приведены наиболее часто используемые функции ввода LISP —

Sr.No. Описание функции
1

чтение и необязательный входной поток eof-error-p eof-value recursive-p

Он считывает напечатанное представление объекта Lisp из input-stream, создает соответствующий объект Lisp и возвращает объект.

2

чтение-сохранение-пробелы и необязательный in-stream eof-error-p eof-value recursive-p

Он используется в некоторых специализированных ситуациях, когда желательно точно определить, каким символом завершен расширенный токен.

3

read-line & необязательный входной поток eof-error-p eof-value recursive-p

Он читает строку текста, оканчивающуюся новой строкой.

4

read-char & необязательный входной поток eof-error-p eof-value recursive-p

Он берет один символ из входного потока и возвращает его как символьный объект.

5

непрочитанный символ и необязательный поток ввода

Он помещает символ, последний прочитанный из потока ввода, в начало потока ввода.

6

peek-char & необязательный входной поток peek-типа eof-error-p eof-value recursive-p

Он возвращает следующий символ, который будет считан из потока ввода, без фактического удаления его из потока ввода.

7

прослушивание и дополнительный поток ввода

Предикат прослушивания имеет значение true, если есть символ, немедленно доступный из потока ввода, и значение false, если нет.

8

read-char-no-hang & необязательный input-stream eof-error-p eof-value recursive-p

Он похож на read-char , но если он не получает символ, он не ждет символа, но немедленно возвращает ноль.

9

чистый ввод и дополнительный поток ввода

Он очищает любой буферизованный ввод, связанный с input-stream.

10

строка чтения из строки и необязательный eof-error-p eof-value & key: start: end: preserve-whitespace

Он последовательно принимает символы строки, создает объект LISP и возвращает объект. Он также возвращает индекс первого символа в строке, который не был прочитан, или длину строки (или длину +1), в зависимости от обстоятельств.

11

строка целочисленного анализа и ключ: начало: конец: основание: нежелательная почта

Он проверяет подстроку строки, разделенную: start и: end (по умолчанию начало и конец строки). Он пропускает пробельные символы, а затем пытается проанализировать целое число.

12

бинарный входной поток чтения и необязательное значение eof-error-p-eof-value

Он читает один байт из потока двоичного ввода и возвращает его в виде целого числа.

чтение и необязательный входной поток eof-error-p eof-value recursive-p

Он считывает напечатанное представление объекта Lisp из input-stream, создает соответствующий объект Lisp и возвращает объект.

чтение-сохранение-пробелы и необязательный in-stream eof-error-p eof-value recursive-p

Он используется в некоторых специализированных ситуациях, когда желательно точно определить, каким символом завершен расширенный токен.

read-line & необязательный входной поток eof-error-p eof-value recursive-p

Он читает строку текста, оканчивающуюся новой строкой.

read-char & необязательный входной поток eof-error-p eof-value recursive-p

Он берет один символ из входного потока и возвращает его как символьный объект.

непрочитанный символ и необязательный поток ввода

Он помещает символ, последний прочитанный из потока ввода, в начало потока ввода.

peek-char & необязательный входной поток peek-типа eof-error-p eof-value recursive-p

Он возвращает следующий символ, который будет считан из потока ввода, без фактического удаления его из потока ввода.

прослушивание и дополнительный поток ввода

Предикат прослушивания имеет значение true, если есть символ, немедленно доступный из потока ввода, и значение false, если нет.

read-char-no-hang & необязательный input-stream eof-error-p eof-value recursive-p

Он похож на read-char , но если он не получает символ, он не ждет символа, но немедленно возвращает ноль.

чистый ввод и дополнительный поток ввода

Он очищает любой буферизованный ввод, связанный с input-stream.

строка чтения из строки и необязательный eof-error-p eof-value & key: start: end: preserve-whitespace

Он последовательно принимает символы строки, создает объект LISP и возвращает объект. Он также возвращает индекс первого символа в строке, который не был прочитан, или длину строки (или длину +1), в зависимости от обстоятельств.

строка целочисленного анализа и ключ: начало: конец: основание: нежелательная почта

Он проверяет подстроку строки, разделенную: start и: end (по умолчанию начало и конец строки). Он пропускает пробельные символы, а затем пытается проанализировать целое число.

бинарный входной поток чтения и необязательное значение eof-error-p-eof-value

Он читает один байт из потока двоичного ввода и возвращает его в виде целого числа.

Чтение ввода с клавиатуры

Функция чтения используется для ввода данных с клавиатуры. Это может не принимать никаких аргументов.

Например, рассмотрим фрагмент кода —

(write ( + 15.0 (read)))

Предположим, что пользователь вводит 10.2 из ввода STDIN, он возвращает,

25.2

Функция read читает символы из входного потока и интерпретирует их, анализируя как представления объектов Lisp.

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код —

; the function AreaOfCircle
; calculates area of a circle
; when the radius is input from keyboard

(defun AreaOfCircle()
(terpri)
(princ "Enter Radius: ")
(setq radius (read))
(setq area (* 3.1416 radius radius))
(princ "Area: ")
(write area))
(AreaOfCircle)

Когда вы выполняете код, он возвращает следующий результат —

Enter Radius: 5 (STDIN Input)
Area: 78.53999

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(with-input-from-string (stream "Welcome to Tutorials Point!")
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (peek-char nil stream nil 'the-end))
   (values)
)

Когда вы выполняете код, он возвращает следующий результат —

#\W 
#\e 
#\l 
#\c 
#\o 
#\m 
#\e 
#\Space 
#\t 
#\o 
#\Space 

Функции вывода

Все функции вывода в LISP принимают необязательный аргумент, называемый output-stream, куда отправляется вывод. Если не указано или равно nil, по умолчанию для output-stream используется значение переменной * standard-output *.

В следующей таблице приведены наиболее часто используемые выходные функции LISP.

Sr.No. Функция и описание
1

запись объекта и ключа: поток: escape: основание: круг: довольно: уровень: длина: регистр: gensym: массив

запись объекта и ключа: поток: escape: основание: основание: круг: довольно: уровень: длина: регистр: gensym: массив: читабельно: правое поле: ширина склейки: строки: pprint-dispatch

Оба записывают объект в выходной поток, заданный параметром: stream, значение по умолчанию которого равно * standard-output *. Другие значения по умолчанию соответствуют глобальным переменным, установленным для печати.

2

объект prin1 и дополнительный поток вывода

объект печати и дополнительный поток вывода

объект pprint и дополнительный поток вывода

объект princ и необязательный выходной поток

Все эти функции выводят печатное представление объекта в output-stream . Тем не менее, существуют следующие различия:

  • prin1 возвращает объект как его значение.

  • print печатает объект с предыдущей новой строкой, за которой следует пробел. Возвращает объект.

  • pprint похож на print, за исключением того, что завершающий пробел пропущен.

  • princ похож на prin1 за исключением того, что в выводе нет экранирующего символа

3

Объект записи в строку и ключ : escape: основание: основание: окружность: довольно: уровень: длина: регистр: gensym: массив

Объект записи в строку и ключ: escape: основание: основание: окружность: довольно: уровень: длина: регистр: gensym: массив: читабельно: правое поле: ширина скриншота: линии: pprint-dispatch

объект prin1-to-string

объект типа « строка-строка»

Объект эффективно печатается, а выходные символы превращаются в строку, которая возвращается.

4

символ записи и дополнительный поток вывода

Он выводит символ в output-stream и возвращает символ.

5

строка записи и необязательный выходной поток и ключ: начало: конец

Он записывает символы указанной подстроки строки в поток вывода.

6

строка записи и необязательный выходной поток и ключ: начало: конец

Он работает так же, как write-string, но впоследствии выводит новую строку.

7

terpri & необязательный выходной поток

Он выводит новую строку в output-stream.

8

свежая линия и дополнительный выходной поток

он выводит новую строку, только если поток еще не находится в начале строки.

9

окончательный вывод и дополнительный выходной поток

принудительный вывод и дополнительный выходной поток

чистый вывод и дополнительный выходной поток

  • Функция finish-output пытается убедиться, что весь вывод, отправленный в output-stream, достиг своего места назначения, и только после этого возвращает nil.

  • Функция force-output инициирует очистку любых внутренних буферов, но возвращает nil, не ожидая завершения или подтверждения.

  • Функция clear-output пытается прервать любую незавершенную операцию вывода, чтобы как можно меньше выходных данных продолжалось до места назначения.

10

запись байтового целого двоичного потока вывода

Записывает один байт, значение целого числа.

запись объекта и ключа: поток: escape: основание: круг: довольно: уровень: длина: регистр: gensym: массив

запись объекта и ключа: поток: escape: основание: основание: круг: довольно: уровень: длина: регистр: gensym: массив: читабельно: правое поле: ширина склейки: строки: pprint-dispatch

Оба записывают объект в выходной поток, заданный параметром: stream, значение по умолчанию которого равно * standard-output *. Другие значения по умолчанию соответствуют глобальным переменным, установленным для печати.

объект prin1 и дополнительный поток вывода

объект печати и дополнительный поток вывода

объект pprint и дополнительный поток вывода

объект princ и необязательный выходной поток

Все эти функции выводят печатное представление объекта в output-stream . Тем не менее, существуют следующие различия:

prin1 возвращает объект как его значение.

print печатает объект с предыдущей новой строкой, за которой следует пробел. Возвращает объект.

pprint похож на print, за исключением того, что завершающий пробел пропущен.

princ похож на prin1 за исключением того, что в выводе нет экранирующего символа

Объект записи в строку и ключ : escape: основание: основание: окружность: довольно: уровень: длина: регистр: gensym: массив

Объект записи в строку и ключ: escape: основание: основание: окружность: довольно: уровень: длина: регистр: gensym: массив: читабельно: правое поле: ширина скриншота: линии: pprint-dispatch

объект prin1-to-string

объект типа « строка-строка»

Объект эффективно печатается, а выходные символы превращаются в строку, которая возвращается.

символ записи и дополнительный поток вывода

Он выводит символ в output-stream и возвращает символ.

строка записи и необязательный выходной поток и ключ: начало: конец

Он записывает символы указанной подстроки строки в поток вывода.

строка записи и необязательный выходной поток и ключ: начало: конец

Он работает так же, как write-string, но впоследствии выводит новую строку.

terpri & необязательный выходной поток

Он выводит новую строку в output-stream.

свежая линия и дополнительный выходной поток

он выводит новую строку, только если поток еще не находится в начале строки.

окончательный вывод и дополнительный выходной поток

принудительный вывод и дополнительный выходной поток

чистый вывод и дополнительный выходной поток

Функция finish-output пытается убедиться, что весь вывод, отправленный в output-stream, достиг своего места назначения, и только после этого возвращает nil.

Функция force-output инициирует очистку любых внутренних буферов, но возвращает nil, не ожидая завершения или подтверждения.

Функция clear-output пытается прервать любую незавершенную операцию вывода, чтобы как можно меньше выходных данных продолжалось до места назначения.

запись байтового целого двоичного потока вывода

Записывает один байт, значение целого числа.

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

; this program inputs a numbers and doubles it
(defun DoubleNumber()
   (terpri)
   (princ "Enter Number : ")
   (setq n1 (read))
   (setq doubled (* 2.0 n1))
   (princ "The Number: ")
   (write n1)
   (terpri)
   (princ "The Number Doubled: ")
   (write doubled)
)
(DoubleNumber)

Когда вы выполняете код, он возвращает следующий результат —

Enter Number : 3456.78 (STDIN Input)
The Number: 3456.78
The Number Doubled: 6913.56

Форматированный вывод

Формат функции используется для создания красиво отформатированного текста. Он имеет следующий синтаксис —

format destination control-string &rest arguments

где,

  • назначение — стандартный вывод
  • control-string содержит символы для вывода и директиву печати.

Директива формата состоит из тильды (~), необязательных параметров префикса, разделенных запятыми, необязательных модификаторов двоеточия (:) и at-sign (@) и одного символа, указывающего, что это за директива.

Параметры префикса обычно представляют собой целые числа, обозначаемые как необязательные десятичные числа со знаком.

В следующей таблице приведено краткое описание часто используемых директив —

Sr.No. Директива и описание
1

~ A

За ним следуют аргументы ASCII.

2

~ S

Сопровождается S-выражениями.

3

~ D

Для десятичных аргументов.

4

~ B

Для двоичных аргументов.

5

~ O

Для восьмеричных аргументов.

6

~ X

Для шестнадцатеричных аргументов.

7

~ C

Для аргументов персонажа.

8

~ F

Для аргументов с плавающей точкой фиксированного формата.

9

~ E

Экспоненциальные аргументы с плавающей точкой.

10

~ $

Доллар и аргументы с плавающей запятой.

11

~%

Новая строка печатается.

12

~ *

Следующий аргумент игнорируется.

13

~?

Косвенность. Следующий аргумент должен быть строкой, а следующий после нее — списком.

~ A

За ним следуют аргументы ASCII.

~ S

Сопровождается S-выражениями.

~ D

Для десятичных аргументов.

~ B

Для двоичных аргументов.

~ O

Для восьмеричных аргументов.

~ X

Для шестнадцатеричных аргументов.

~ C

Для аргументов персонажа.

~ F

Для аргументов с плавающей точкой фиксированного формата.

~ E

Экспоненциальные аргументы с плавающей точкой.

~ $

Доллар и аргументы с плавающей запятой.

~%

Новая строка печатается.

~ *

Следующий аргумент игнорируется.

~?

Косвенность. Следующий аргумент должен быть строкой, а следующий после нее — списком.

пример

Перепишем программу расчета площади круга —

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

(defun AreaOfCircle()
   (terpri)
   (princ "Enter Radius: ")
   (setq radius (read))
   (setq area (* 3.1416 radius radius))
   (format t "Radius: = ~F~% Area = ~F" radius area)
)
(AreaOfCircle)

Когда вы выполняете код, он возвращает следующий результат —