Siguiente: , Anterior: , Subir: stringproc   [Índice general][Índice]

76.2 Funciones y variables para entrada y salida

Ejemplo:

(%i1) s: openw("E:/file.txt");
(%o1)                     #<output stream E:/file.txt>
(%i2) control: 
"~2tAn atom: ~20t~a~%~2tand a list: ~20t~{~r ~}~%~2t\
           and an integer: ~20t~d~%"$
(%i3) printf( s,control, 'true,[1,2,3],42 )$
(%o3)                                false
(%i4) close(s);
(%o4)                                true
(%i5) s: openr("E:/file.txt");
(%o5)                     #<input stream E:/file.txt>
(%i6) while stringp( tmp:readline(s) ) do print(tmp)$
  An atom:          true 
  and a list:       one two three  
  and an integer:   42 
(%i7) close(s)$
Función: close (stream)

Cierra el flujo de datos stream y devuelve true si stream había sido abierto.

Función: flength (stream)

Devuelve el número de elementos en stream, el cual debe ser un flujo de datos desde o hacia un fichero.

Función: fposition (stream)
Función: fposition (stream, pos)

Devuelve la posición actual en el flujo de datos stream si no se utiliza pos. Si se utiliza pos, fposition fija la posición en stream. stream debe ser un flujo de datos desde o hacia un fichero y pos debe ser un entero positivo que hace corresponder al primer elemento de stream la posición 1.

Función: freshline ()
Función: freshline (stream)

Escribe una nueva línea (en el flujo de datos stream) si la posición actual no corresponde al inicio de la línea.

Véase también newline.

Función: get_output_stream_string (stream)

Devuelve una cadena con todos los caracteres presentes en stream, que debe ser un flujo de datos de salida abiero. Los caracteres devueltos son eliminados de stream.

Para un ejemplo, véase make_string_output_stream .

Función: make_string_input_stream (string)
Función: make_string_input_stream (string, start)
Función: make_string_input_stream (string, start, end)

Devuelve un flujo de entrada que contiene partes de string junto con el carácter de final de fichero. Sin argumentos opcionales, el flujo contiene la cadena entera y se posiciona frente al primer carácter. Los argumentos start y end definen la subcadena contenida en el flujo. El primer carácter está disponible en la posición 1.

Ejemplo:

(%i1) istream : make_string_input_stream("text", 1, 4);
(%o1)              #<string-input stream from "text">
(%i2) (while (c : readchar(istream)) # false do sprint(c), newline())$
t e x 
(%i3) close(istream)$
Función: make_string_output_stream ()

Devuelve un flujo de salida que acepta caracteres. Los caracteres de este flujo podrán obtenerse con get_output_stream_string.

Ejemplo:

(%i1) ostream : make_string_output_stream();
(%o1)               #<string-output stream 09622ea0>
(%i2) printf(ostream, "foo")$

(%i3) printf(ostream, "bar")$

(%i4) string : get_output_stream_string(ostream);
(%o4)                            foobar
(%i5) printf(ostream, "baz")$

(%i6) string : get_output_stream_string(ostream);
(%o6)                              baz
(%i7) close(ostream)$
Función: newline ()
Función: newline (stream)

Escribe una nueva línea (en el flujo de datos stream).

Véase sprint para un ejemplo de uso de newline().

Nótese que hay algunos casos en los que newline no trabaja según lo esperado.

Función: opena (file)

Devuelve un flujo de datos al fichero file. Si se abre un fichero ya existente, opena añade elementos al final del fichero.

Función: openr (file)

Devuelve un flujo de datos de entrada al fichero file. Si file no existe, será creado.

Función: openw (file)

Devuelve un flujo de datos de salida al fichero file. Si file no existe, será creado. Si se abre un fichero ya existente, openw lo modifica borrando el contenido anterior.

Función: printf (dest, string)
Función: printf (dest, string, expr_1, ..., expr_n)

Genera una cadena de caracteres a partir de la cadena de control string, teniendo en cuenta que las tildes introducen directivas. El carácter que va después de la tilde, posiblemente precedido por parámetros y modificadores, especifica el tipo de formato que se desea. La mayor parte de las directivas usan uno o más elementos de los argumentos expr_1, ..., expr_n para crear la salida.

Si dest es un flujo o vale true, entonces printf devuelve false. En otro caso, printf devuelve una cadena conteniendo la salida.

printf da acceso a la función format de Common Lisp. El siguiente ejemplo muestra la relación entre estas dos funciones.

(%i1) printf(true, "R~dD~d~%", 2, 2);
R2D2
(%o1)                                false
(%i2) :lisp (format t "R~dD~d~%" 2 2)
R2D2
NIL

La siguiente descripción es un simple resumen de las posibilidades de printf. La función format de Common Lisp se encuentra descrita en detalle en muchas referencias, como el manual libre "Common Lisp the Language" de Guy L. Steele; en particular, el capítulo 22.3.3.

   ~%       nueva línea
   ~&       línea de refresco
   ~t       tabulación
   ~$       moneda
   ~d       entero en base decimal
   ~b       entero en base binaria
   ~o       entero en base octal
   ~x       entero en base hexadecimal
   ~br      entero en base b
   ~r       deletrea un entero
   ~p       plural
   ~f       decimal en coma flotante
   ~e       notación científica
   ~g       ~f o ~e, dependiendo de la magnitud
   ~h       número decimal grande (bigfloat)
   ~a       utiliza la función string de Maxima
   ~s       como ~a, pero las cadenas se devuelven entre "comillas dobles"
   ~~       ~
   ~<       justificación, ~> termina
   ~(       conversor mayúscula/minúscula, ~) termina 
   ~[       selección, ~] termina 
   ~{       iteración, ~} termina

La directiva ~h para números decimales grandes no pertenece al estándar de Lisp, por lo que se ilustra más abajo.

La directiva ~* no está soportada.

Ejemplos:

Si dest es un flujo o vale true, entonces printf devuelve false. En otro caso, printf devuelve una cadena conteniendo la salida.

(%i1) printf( false, "~a ~a ~4f ~a ~@r", 
              "String",sym,bound,sqrt(12),144), bound = 1.234;
(%o1)                 String sym 1.23 2*sqrt(3) CXLIV
(%i2) printf( false,"~{~a ~}",["one",2,"THREE"] );
(%o2)                          one 2 THREE 
(%i3) printf(true,"~{~{~9,1f ~}~%~}",mat ),
          mat = args(matrix([1.1,2,3.33],[4,5,6],[7,8.88,9]))$
      1.1       2.0       3.3 
      4.0       5.0       6.0 
      7.0       8.9       9.0 
(%i4) control: "~:(~r~) bird~p ~[is~;are~] singing."$
(%i5) printf( false,control, n,n,if n=1 then 1 else 2 ), n=2;
(%o5)                    Two birds are singing.

La directiva ~h se ha introducido para formatear decimales grandes.

~w,d,e,x,o,p@H
 w : width
 d : decimal digits behind floating point
 e : minimal exponent digits
 x : preferred exponent
 o : overflow character
 p : padding character
 @ : display sign for positive numbers
(%i1) fpprec : 1000$
(%i2) printf(true, "|~h|~%", 2.b0^-64)$
|0.0000000000000000000542101086242752217003726400434970855712890625|
(%i3) fpprec : 26$
(%i4) printf(true, "|~h|~%", sqrt(2))$
|1.4142135623730950488016887|
(%i5) fpprec : 24$
(%i6) printf(true, "|~h|~%", sqrt(2))$
|1.41421356237309504880169|
(%i7) printf(true, "|~28h|~%", sqrt(2))$
|   1.41421356237309504880169|
(%i8) printf(true, "|~28,,,,,'*h|~%", sqrt(2))$
|***1.41421356237309504880169|
(%i9) printf(true, "|~,18h|~%", sqrt(2))$
|1.414213562373095049|
(%i10) printf(true, "|~,,,-3h|~%", sqrt(2))$
|1414.21356237309504880169b-3|
(%i11) printf(true, "|~,,2,-3h|~%", sqrt(2))$
|1414.21356237309504880169b-03|
(%i12) printf(true, "|~20h|~%", sqrt(2))$
|1.41421356237309504880169|
(%i13) printf(true, "|~20,,,,'+h|~%", sqrt(2))$
|++++++++++++++++++++|
Función: readchar (stream)

Elimina y devuelve el primer carácter de stream. Si se ha alcanzado el final del fichero, readchar devuelve false.

Para un ejemplo, véase make_string_input_stream.

Función: readline (stream)

Devuelve una cadena con los caracteres desde la posición actual en el flujo de datos stream hasta el final de la línea, o false si se ha alcanzado el final del fichero.

Función: sprint (expr_1, ..., expr_n)

Evalúa y muestra sus argumentos uno tras otro en un renglón comenzando por su extremo izquierdo.

La función newline(), que se carga automáticamente desde stringproc.lisp, puede ser de utilidad si se quiere intercalar un salto de línea.

(%i1) for n:0 thru 19 do sprint( fib(n) )$
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
(%i2) for n:0 thru 22 do ( 
         sprint(fib(n)), if mod(n,10)=9 then newline() )$
0 1 1 2 3 5 8 13 21 34 
55 89 144 233 377 610 987 1597 2584 4181 
6765 10946 17711 

Siguiente: , Anterior: , Subir: stringproc   [Índice general][Índice]