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 -

  • prin1 retorna o objeto como seu valor.

  • print imprime o objeto com uma nova linha precedente e seguida por um espaço. Ele retorna o objeto.

  • pprint é igual a print, exceto que o espaço à direita é omitido.

  • princ é como prin1 exceto que a saída não tem caractere de escape

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

  • A função finish-output tenta garantir que toda a saída enviada para o fluxo de saída atingiu seu destino e só então retorna nil.

  • A função force-output inicia o esvaziamento de quaisquer buffers internos, mas retorna nulo sem esperar pela conclusão ou confirmação.

  • A função clear-output tenta abortar qualquer operação de saída pendente em andamento para permitir que a menor saída possível continue até o destino.

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