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 объект и дополнительный поток вывода Все эти функции выводят печатное представление объекта в поток вывода . Однако есть следующие отличия -
|
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& необязательный поток вывода
|
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