LISP - wejście i wyjście
Wspólny LISP zapewnia liczne funkcje wejścia-wyjścia. Użyliśmy już funkcji formatu i funkcji drukowania do wyjścia. W tej sekcji przyjrzymy się niektórym z najczęściej używanych funkcji wejścia-wyjścia dostępnych w LISP.
Funkcje wejściowe
Poniższa tabela przedstawia najczęściej używane funkcje wejściowe LISP -
Sr.No. | Opis funkcji |
---|---|
1 | read& opcjonalny strumień wejściowy eof-error-p eof-value recursive-p Wczytuje wydrukowaną reprezentację obiektu Lisp ze strumienia wejściowego, buduje odpowiedni obiekt Lisp i zwraca obiekt. |
2 | read-preserving-whitespace& opcjonalny in-stream eof-error-p eof-value recursive-p Jest używany w niektórych szczególnych sytuacjach, w których pożądane jest dokładne określenie, jaki znak zakończył rozszerzony token. |
3 | read-line& opcjonalny strumień wejściowy eof-error-p eof-value recursive-p Czyta wiersz tekstu zakończony znakiem nowej linii. |
4 | read-char& opcjonalny strumień wejściowy eof-error-p eof-value recursive-p Pobiera jeden znak ze strumienia wejściowego i zwraca go jako obiekt znakowy. |
5 | unread-char znak i opcjonalny strumień wejściowy Umieszcza ostatnio odczytany znak ze strumienia wejściowego na początku strumienia wejściowego. |
6 | peek-char& opcjonalny strumień wejściowy typu peek eof-error-p eof-value recursive-p Zwraca następny znak do odczytania ze strumienia wejściowego, bez faktycznego usuwania go ze strumienia wejściowego. |
7 | listen& opcjonalny strumień wejściowy Predykat listen ma wartość true, jeśli istnieje znak natychmiast dostępny ze strumienia wejściowego, i ma wartość false, jeśli nie. |
8 | read-char-no-hang& opcjonalny strumień wejściowy eof-error-p eof-value recursive-p To jest podobne do read-char, ale jeśli nie otrzyma znaku, nie czeka na znak, ale natychmiast zwraca nil. |
9 | clear-input& opcjonalny strumień wejściowy Czyści wszelkie buforowane dane wejściowe związane ze strumieniem wejściowym. |
10 | read-from-string string & opcjonalny eof-error-p eof-value & key: start: end: preserve-whiteespace Pobiera kolejno znaki łańcucha, buduje obiekt LISP i zwraca obiekt. Zwraca również indeks pierwszego znaku w ciągu, który nie został odczytany, lub długość ciągu (lub długość +1), w zależności od przypadku. |
11 | parse-integer string & key: start: end: radix: junk-allowed Sprawdza podłańcuch łańcucha rozdzielany przez: początek i: koniec (domyślnie początek i koniec łańcucha). Pomija białe znaki, a następnie próbuje przeanalizować liczbę całkowitą. |
12 | read-byte binarny strumień wejściowy i opcjonalny eof-error-p eof-value Odczytuje jeden bajt z binarnego strumienia wejściowego i zwraca go w postaci liczby całkowitej. |
Czytanie danych wejściowych z klawiatury
Plik readFunkcja służy do pobierania danych wejściowych z klawiatury. Może nie wymagać żadnych argumentów.
Weźmy na przykład pod uwagę fragment kodu -
(write ( + 15.0 (read)))
Załóżmy, że użytkownik wprowadza 10.2 z wejścia STDIN, zwraca,
25.2
Funkcja read odczytuje znaki ze strumienia wejściowego i interpretuje je, analizując je jako reprezentacje obiektów Lisp.
Przykład
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod -
; 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)
Po wykonaniu kodu zwraca następujący wynik -
Enter Radius: 5 (STDIN Input)
Area: 78.53999
Przykład
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(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)
)
Po wykonaniu kodu zwraca następujący wynik -
#\W
#\e
#\l
#\c
#\o
#\m
#\e
#\Space
#\t
#\o
#\Space
Funkcje wyjściowe
Wszystkie funkcje wyjściowe w LISP-ie przyjmują opcjonalny argument o nazwie output-stream, do którego wysyłane są dane wyjściowe. Jeśli nie podano lub nil, strumień wyjściowy przyjmuje wartość zmiennej * standardowe wyjście *.
Poniższa tabela przedstawia najczęściej używane funkcje wyjściowe LISP -
Sr.No. | Funkcja i opis |
---|---|
1 | write obiekt i klucz: strumień: ucieczka: podstawa: okrąg: ładny: poziom: długość: obudowa: gensym: tablica write obiekt i klucz: strumień: ucieczka: podstawa: podstawa: okrąg: ładny: poziom: długość: obudowa: gensym: tablica: czytelnie: prawy margines: skąpiec-szerokość: linie: pprint-wysyłka Oba zapisują obiekt w strumieniu wyjściowym określonym przez: stream, który domyślnie ma wartość * standard-output *. Inne wartości domyślnie odpowiadają odpowiednim zmiennym globalnym ustawionym do drukowania. |
2 | prin1 obiekt i opcjonalny strumień wyjściowy print obiekt i opcjonalny strumień wyjściowy pprint obiekt i opcjonalny strumień wyjściowy princ obiekt i opcjonalny strumień wyjściowy Wszystkie te funkcje wyprowadzają drukowaną reprezentację obiektu do strumienia wyjściowego . Istnieją jednak następujące różnice -
|
3 | write-to-string obiekt i klucz : ucieczka: podstawa: podstawa: okrąg: ładny: poziom: długość: obudowa: gensym: tablica write-to-string obiekt i klucz: ucieczka: podstawa: podstawa: okrąg: ładny: poziom: długość: sprawa: gensym: tablica: czytelnie: prawy margines: skąpiec-szerokość: linie: pprint-wysyłka prin1-to-string obiekt princ-to-string obiekt Obiekt jest skutecznie drukowany, a znaki wyjściowe są przekształcane w łańcuch, który jest zwracany. |
4 | write-char znak i opcjonalny strumień wyjściowy Wyprowadza znak do strumienia wyjściowego i zwraca znak. |
5 | write-string ciąg i opcjonalny strumień wyjściowy i klucz: początek: koniec Zapisuje znaki z określonego podciągu łańcucha do strumienia wyjściowego. |
6 | write-line ciąg i opcjonalny strumień wyjściowy i klucz: początek: koniec Działa w ten sam sposób, co napis-napis, ale później wyświetla nowy wiersz. |
7 | terpri& opcjonalny strumień wyjściowy Wyprowadza nową linię do strumienia wyjściowego. |
8 | fresh-line& opcjonalny strumień wyjściowy wypisuje znak nowej linii tylko wtedy, gdy strumień nie jest jeszcze na początku linii. |
9 | finish-output& opcjonalny strumień wyjściowy force-output& opcjonalny strumień wyjściowy clear-output& opcjonalny strumień wyjściowy
|
10 | write-byte całkowity strumień binarny-wyjściowy Zapisuje jeden bajt, wartość liczby całkowitej. |
Przykład
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
; 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)
Po wykonaniu kodu zwraca następujący wynik -
Enter Number : 3456.78 (STDIN Input)
The Number: 3456.78
The Number Doubled: 6913.56
Sformatowane dane wyjściowe
Funkcja formatsłuży do tworzenia ładnie sformatowanego tekstu. Ma następującą składnię -
format destination control-string &rest arguments
gdzie,
- przeznaczenie to standardowe wyjście
- łańcuch-kontrolny zawiera znaki do wyprowadzenia i dyrektywę print.
ZA format directive składa się z tyldy (~), opcjonalnych parametrów przedrostka oddzielonych przecinkami, opcjonalnego dwukropka (:) i modyfikatorów at-sign (@) oraz pojedynczego znaku wskazującego rodzaj dyrektywy.
Parametry przedrostka są zazwyczaj liczbami całkowitymi, zapisanymi jako opcjonalne liczby dziesiętne ze znakiem.
Poniższa tabela zawiera krótki opis najczęściej używanych dyrektyw -
Sr.No. | Dyrektywa i opis |
---|---|
1 | ~A Po nim następują argumenty ASCII. |
2 | ~S Po nim następuje wyrażenia S. |
3 | ~D Dla argumentów dziesiętnych. |
4 | ~B Dla argumentów binarnych. |
5 | ~O Dla argumentów ósemkowych. |
6 | ~X Dla argumentów szesnastkowych. |
7 | ~C Dla argumentów znakowych. |
8 | ~F Dla argumentów zmiennoprzecinkowych o stałym formacie. |
9 | ~E Wykładnicze argumenty zmiennoprzecinkowe. |
10 | ~$ Argumenty dolarowe i zmiennoprzecinkowe. |
11 | ~% Drukowany jest nowy wiersz. |
12 | ~* Następny argument jest ignorowany. |
13 | ~? Pośredni. Następny argument musi być łańcuchem, a następny - listą. |
Przykład
Przepiszmy program obliczający pole koła -
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(defun AreaOfCircle()
(terpri)
(princ "Enter Radius: ")
(setq radius (read))
(setq area (* 3.1416 radius radius))
(format t "Radius: = ~F~% Area = ~F" radius area)
)
(AreaOfCircle)
Po wykonaniu kodu zwraca następujący wynik -
Enter Radius: 10.234 (STDIN Input)
Radius: = 10.234
Area = 329.03473