LISP - Entrada e Saída
O LISP comum fornece várias funções de entrada e saída. Já usamos a função de formato e a função de impressão para saída. Nesta seção, veremos algumas das funções de entrada-saída mais comumente usadas fornecidas no LISP.
Funções de entrada
A tabela a seguir fornece as funções de entrada mais comumente usadas do LISP -
Sr. Não. | Descrição da função |
---|---|
1 | read& fluxo de entrada opcional eof-erro-p eof-valor recursivo-p Ele lê a representação impressa de um objeto Lisp do fluxo de entrada, constrói um objeto Lisp correspondente e retorna o objeto. |
2 | read-preserving-whitespacee opcional in-stream eof-erro-p eof-valor recursivo-p É usado em algumas situações especializadas em que é desejável determinar precisamente que caractere encerrou o token estendido. |
3 | read-line& fluxo de entrada opcional eof-erro-p eof-valor recursivo-p Ele lê uma linha de texto terminada por uma nova linha. |
4 | read-char& fluxo de entrada opcional eof-erro-p eof-valor recursivo-p Ele pega um caractere do fluxo de entrada e o retorna como um objeto de caractere. |
5 | unread-char caractere e fluxo de entrada opcional Ele coloca o caractere lido mais recentemente do fluxo de entrada na frente do fluxo de entrada. |
6 | peek-char& opcional peek-type input-stream eof-error-p eof-value recursive-p Ele retorna o próximo caractere a ser lido do fluxo de entrada, sem realmente removê-lo do fluxo de entrada. |
7 | listen& fluxo de entrada opcional O predicado listen é verdadeiro se houver um caractere imediatamente disponível no fluxo de entrada e é falso se não houver. |
8 | read-char-no-hang& fluxo de entrada opcional eof-erro-p eof-valor recursivo-p É similar à read-char, mas se não obtiver um caractere, não espera por um caractere, mas retorna nil imediatamente. |
9 | clear-input& fluxo de entrada opcional Ele limpa qualquer entrada em buffer associada ao fluxo de entrada. |
10 | read-from-string string & opcional eof-error-p eof-value & key: start: end: preserve-whitespace Ele pega os caracteres da string sucessivamente e constrói um objeto LISP e retorna o objeto. Ele também retorna o índice do primeiro caractere na string não lida ou o comprimento da string (ou, comprimento +1), conforme o caso. |
11 | parse-integer string & key: start: end: radix: junk-allowed Ele examina a substring da string delimitada por: start e: end (padrão para o início e o fim da string). Ele pula os caracteres de espaço em branco e, em seguida, tenta analisar um número inteiro. |
12 | read-byte binário-input-stream e eof-error-p eof-value opcional Ele lê um byte do fluxo de entrada binária e o retorna na forma de um inteiro. |
Lendo entrada do teclado
o readfunção é usada para obter dados do teclado. Pode não ser necessário nenhum argumento.
Por exemplo, considere o snippet de código -
(write ( + 15.0 (read)))
Suponha que o usuário insira 10.2 na entrada STDIN, ele retorna,
25.2
A função read lê caracteres de um fluxo de entrada e os interpreta analisando como representações de objetos Lisp.
Exemplo
Crie um novo arquivo de código-fonte chamado main.lisp e digite o seguinte código nele -
; 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)
Quando você executa o código, ele retorna o seguinte resultado -
Enter Radius: 5 (STDIN Input)
Area: 78.53999
Exemplo
Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.
(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)
)
Quando você executa o código, ele retorna o seguinte resultado -
#\W
#\e
#\l
#\c
#\o
#\m
#\e
#\Space
#\t
#\o
#\Space
As funções de saída
Todas as funções de saída no LISP recebem um argumento opcional chamado output-stream, onde a saída é enviada. Se não for mencionado ou nulo, o padrão do fluxo de saída é o valor da variável * saída padrão *.
A tabela a seguir fornece as funções de saída mais comumente usadas do LISP -
Sr. Não. | Função e descrição |
---|---|
1 | write objeto e chave: stream: escape: radix: base: circle: pretty: level: length: case: gensym: array write object & key: stream: escape: radix: base: circle: pretty: level: length: case: gensym: array: readably: right-margin: miser-width: lines: pprint-dispatch Ambos gravam o objeto no fluxo de saída especificado por: stream, cujo padrão é o valor de * saída padrão *. Outros valores são padronizados para as variáveis globais correspondentes definidas para impressão. |
2 |
prin1 objeto e fluxo de saída opcional print objeto e fluxo de saída opcional pprint objeto e fluxo de saída opcional princ objeto e fluxo de saída opcional Todas essas funções geram a representação impressa do objeto para o fluxo de saída . No entanto, as seguintes diferenças existem -
|
3 | write-to-string objeto e chave : escape: radix: base: circle: pretty: level: length: case: gensym: array write-to-string object & key: escape: radix: base: circle: pretty: level: length: case: gensym: array: readably: right-margin: miser-width: lines: pprint-dispatch prin1-to-string objeto princ-to-string objeto O objeto é efetivamente impresso e os caracteres de saída são transformados em uma string, que é retornada. |
4 | write-char caractere e fluxo de saída opcional Ele envia o caractere para o fluxo de saída e retorna o caractere. |
5 | write-string string e fluxo de saída opcional e chave: início: fim Ele grava os caracteres da substring especificada de string no fluxo de saída. |
6 | write-line string e fluxo de saída opcional e chave: início: fim Funciona da mesma maneira que a string de escrita, mas depois produz uma nova linha. |
7 | terpri& fluxo de saída opcional Ele produz uma nova linha para o fluxo de saída. |
8 | fresh-line& fluxo de saída opcional ele produz uma nova linha apenas se o fluxo ainda não estiver no início de uma linha. |
9 | finish-output& fluxo de saída opcional force-output& fluxo de saída opcional clear-output& fluxo de saída opcional
|
10 | write-byte fluxo de saída binária inteiro Ele grava um byte, o valor do inteiro. |
Exemplo
Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.
; 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)
Quando você executa o código, ele retorna o seguinte resultado -
Enter Number : 3456.78 (STDIN Input)
The Number: 3456.78
The Number Doubled: 6913.56
Saída formatada
A função formaté usado para produzir texto bem formatado. Possui a seguinte sintaxe -
format destination control-string &rest arguments
Onde,
- destino é a saída padrão
- string de controle contém os caracteres a serem produzidos e a diretiva de impressão.
UMA format directive consiste em um til (~), parâmetros de prefixo opcionais separados por vírgulas, dois pontos opcionais (:) e modificadores de arroba (@) e um único caractere indicando que tipo de diretiva é essa.
Os parâmetros de prefixo são geralmente inteiros, notados como números decimais opcionalmente assinados.
A tabela a seguir fornece uma breve descrição das diretivas comumente usadas -
Sr. Não. | Diretriz e descrição |
---|---|
1 | ~A É seguido por argumentos ASCII. |
2 | ~S É seguido por S-expressões. |
3 | ~D Para argumentos decimais. |
4 | ~B Para argumentos binários. |
5 | ~O Para argumentos octais. |
6 | ~X Para argumentos hexadecimais. |
7 | ~C Para argumentos de personagem. |
8 | ~F Para argumentos de ponto flutuante de formato fixo. |
9 | ~E Argumentos de ponto flutuante exponencial. |
10 | ~$ Argumentos de dólar e ponto flutuante. |
11 | ~% Uma nova linha é impressa. |
12 | ~* O próximo argumento é ignorado. |
13 | ~? Indireção. O próximo argumento deve ser uma string e o seguinte, uma lista. |
Exemplo
Vamos reescrever o programa calculando a área de um círculo -
Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.
(defun AreaOfCircle()
(terpri)
(princ "Enter Radius: ")
(setq radius (read))
(setq area (* 3.1416 radius radius))
(format t "Radius: = ~F~% Area = ~F" radius area)
)
(AreaOfCircle)
Quando você executa o código, ele retorna o seguinte resultado -
Enter Radius: 10.234 (STDIN Input)
Radius: = 10.234
Area = 329.03473