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 -

  • prin1 zwraca obiekt jako jego wartość.

  • print drukuje obiekt z poprzedzającym znakiem nowej linii, po którym następuje spacja. Zwraca obiekt.

  • pprint działa tak samo jak print, z tym wyjątkiem, że spacja na końcu jest pomijana.

  • princ jest podobne do prin1, z tym wyjątkiem, że wyjście nie ma znaku ucieczki

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

  • Funkcja finish-output próbuje upewnić się, że wszystkie dane wyjściowe wysyłane do strumienia wyjściowego dotarły do ​​celu i dopiero wtedy zwraca nil.

  • Funkcja force-output inicjuje opróżnianie wszelkich buforów wewnętrznych, ale zwraca nil bez czekania na zakończenie lub potwierdzenie.

  • Funkcja clear-output próbuje przerwać każdą zaległą operację wyjściową w toku, aby pozwolić jak najmniejszej liczbie wyjść na kontynuację do miejsca docelowego.

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