LISP - ввод и вывод

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

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

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

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

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

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

2

read-preserving-whitespace& необязательный 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

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

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

6

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

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

7

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

Предикат listen истинно, если есть символ, сразу доступный из потока ввода, и ложно, если нет.

8

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

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

9

clear-input& необязательный поток ввода

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

10

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

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

11

parse-integer строка и ключ: начало: конец: основание системы счисления: разрешенный мусор

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

12

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

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

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

В readфункция используется для ввода с клавиатуры. Он не может принимать никаких аргументов.

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

(write ( + 15.0 (read)))

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

25.2

Функция чтения считывает символы из входного потока и интерпретирует их путем синтаксического анализа как представления объектов 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 и введите в него следующий код.

(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 принимают необязательный аргумент, называемый потоком вывода, куда отправляется вывод. Если не указано или равно нулю, по умолчанию для потока вывода используется значение переменной * standard-output *.

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

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

write объект и ключ: поток: escape: radix: base: circle: pretty: level: length: case: gensym: array

write объект и ключ: поток: escape: radix: base: circle: pretty: level: length: case: gensym: array: readable: right-margin: miser-width: lines: pprint-dispatch

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

2

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

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

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

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

Все эти функции выводят печатное представление объекта в поток вывода . Однако есть следующие отличия -

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

  • print печатает объект с предшествующей новой строкой и пробелом. Он возвращает объект.

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

  • princ аналогичен prin1 за исключением того, что вывод не имеет escape-символа

3

write-to-string объект и ключ : escape: radix: base: circle: pretty: level: length: case: gensym: array

write-to-string объект и ключ: escape: radix: base: circle: pretty: level: length: case: gensym: array: readable: right-margin: miser-width: lines: pprint-dispatch

prin1-to-string объект

princ-to-string объект

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

4

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

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

5

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

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

6

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

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

7

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

Он выводит новую строку в поток вывода.

8

fresh-line& необязательный поток вывода

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

9

finish-output& необязательный поток вывода

force-output& необязательный поток вывода

clear-output& необязательный поток вывода

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

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

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

10

write-byte целочисленный двоичный поток вывода

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

пример

Создайте новый файл исходного кода с именем 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используется для создания красиво отформатированного текста. Он имеет следующий синтаксис -

format destination control-string &rest arguments

где,

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

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

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

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

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

~?

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

пример

Перепишем программу вычисления площади круга -

Создайте новый файл исходного кода с именем 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)

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

Enter Radius: 10.234 (STDIN Input)
Radius: = 10.234
Area = 329.03473