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

76.1 Introducción al procesamiento de cadenas

El paquete stringproc amplía las capacidades de Maxima para manipular cadenas de caracteres, al tiempo que añade algunas funciones útiles para la lectura y escritura de ficheros.

Para dudas y fallos, por favor contáctese con volkervannek at gmail dot com.

En Maxima, una cadena de caracteres se construye fácilmente escribiéndola entre comillas dobles, como en "texto". La función stringp comprueba si el argumento es una cadena.

(%i1) m: "text";
(%o1)                         text
(%i2) stringp(m);
(%o2)                         true

Los caracteres se representan como cadenas de longitud unidad. No se tratan como caracteres Lisp. Se pueden chequear con la función charp (o con lcharp para los caracteres Lisp). La conversión de caracteres Lisp a caracteres Maxima se realiza con la función cunlisp.

(%i1) c: "e";
(%o1)                           e
(%i2) [charp(c),lcharp(c)];
(%o2)                     [true, false]
(%i3) supcase(c);
(%o3)                           E
(%i4) charp(%);
(%o4)                         true

Todos los caracteres devueltos por las funciones de stringproc son caracteres de Maxima. Puesto que los caracteres introducidos son cadenas de longitud igual a la unidad, se pueden utilizar las funciones de cadenas también para los caracteres, como se ha hecho con supcase en el anterior ejemplo.

Es importante tener en cuenta que el primer carácter en una cadena de Maxima ocupa la posición 1. Esto se ha diseñado así para mantener la compatibilidad con las listas de Maxima. Véanse las definiciones de charat y charlist para ver ejemplos.

Las funciones de cadena se utilizan frecuentemente cuando se trabaja con ficheros. El siguiente ejemplo muestra algunas de estas funciones en acción.

Ejemplo:

La función openw envía un flujo de salida hacia un fichero, entonces printf permitirá formatera la escritura en este fichero. Véase printf para más detalles.

(%i1) s: openw("E:/file.txt");
(%o1)                    #<output stream E:/file.txt>
(%i2) for n:0 thru 10 do printf( s, "~d ", fib(n) );
(%o2)                                done
(%i3) printf( s, "~%~d ~f ~a ~a ~f ~e ~a~%", 
              42,1.234,sqrt(2),%pi,1.0e-2,1.0e-2,1.0b-2 );
(%o3)                                false
(%i4) close(s);
(%o4)                                true

Una vez cerrado el flujo, se podrá abrir nuevamente. La función readline devuelve el renglón entero como una única cadena. El paquete stringproc dispone de muchas funciones para manipular cadenas. La separación de palabras se puede hacer con split o tokens.

(%i5) s: openr("E:/file.txt");
(%o5)                     #<input stream E:/file.txt>
(%i6) readline(s);
(%o6)                     0 1 1 2 3 5 8 13 21 34 55 
(%i7) line: readline(s);
(%o7)               42 1.234 sqrt(2) %pi 0.01 1.0E-2 1.0b-2
(%i8) list: tokens(line);
(%o8)           [42, 1.234, sqrt(2), %pi, 0.01, 1.0E-2, 1.0b-2]
(%i9) map( parsetoken, list );
(%o9)           [42, 1.234, false, false, 0.01, 0.01, false]

La función parsetoken sólo analiza sintácticamente números enteros y decimales. El análisis de símbolos y números decimales grandes (big floats) necesita parse_string, que se cargar automáticamente desde eval_string.lisp.

(%i5) s: openr("E:/file.txt");
(%o5)                     #<input stream E:/file.txt>
(%i6) readline(s);
(%o6)                     0 1 1 2 3 5 8 13 21 34 55 
(%i7) line: readline(s);
(%o7)               42 1.234 sqrt(2) %pi 0.01 1.0E-2 1.0b-2
(%i8) list: tokens(line);
(%o8)           [42, 1.234, sqrt(2), %pi, 0.01, 1.0E-2, 1.0b-2]
(%i9) map( parse_string, list );
(%o9)            [42, 1.234, sqrt(2), %pi, 0.01, 0.01, 1.0b-2]
(%i10) float(%);
(%o10) [42.0, 1.234, 1.414213562373095, 3.141592653589793, 0.01,
                                                     0.01, 0.01]
(%i11) readline(s);
(%o11)                               false
(%i12) close(s)$

La función readline devuelve false cuando se alcanza el final del fichero.


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