[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

67. stringproc


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

67.1 Introducción al procesamiento de cadenas

El paquete stringproc amplía las capacidades de Maxima para manipular cadenas de caracteres; para cargarlo basta con ejecutar la sentencia load("stringproc").

En Maxima, una cadena de caracteres se construye fácilmente escribiéndola entre comillas dobles ("). Téngase en cuenta que las cadenas de Maxima no son cadenas de Lisp, pudiéndose ejecutar las funciones de chequeo stringp y lstringp con el fin de dilucidar qué tipo de cadena es su argumento. Si por cualquier motivo el usuario tiene una cadena de Lisp y la quiere convertir a una cadena de Maxima habrá de utilizar la función conversora sunlisp.

 
(%i1) load("stringproc")$
(%i2) m: "text";
(%o2)                         text
(%i3) [stringp(m),lstringp(m)];
(%o3)                     [true, false]
(%i4) l: sconcat("text");
(%o4)                         text
(%i5) [stringp(l),lstringp(l)];
(%o5)                     [false, true]
(%i6) stringp( sunlisp(l) );
(%o6)                         true

Todas las cadenas devueltas por las funciones de stringproc son cadenas de Maxima.

Los caracteres individuales se introducen como cadenas de Maxima de longitud igual a la unidad. Estos caracteres no son caracteres de Lisp y se pueden chequear con las funciones charp y lcharp, pudiéndose convertir los caracteres de Lisp a Maxima mediante cunlisp.

 
(%i1) load("stringproc")$
(%i2) c: "e";
(%o2)                           e
(%i3) [charp(c),lcharp(c)];
(%o3)                     [true, false]
(%i4) supcase(c);
(%o4)                           E
(%i5) charp(%);
(%o5)                         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 cadenas se utilizan frecuentemente cuando se trabaja con ficheros. El paquete stringproc dispone de algunas funciones de escritura que pueden ser útiles. Por ejemplo, si un fichero contiene instrucciones de entrada y salidas de Maxima, la función extracti extrae los valores de todas las etiquetas de entrada para un fichero que puede ser leído por Maxima y cuya ruta es devuelta por la función. El fichero podrá ser ejecutado inmediatamente con batch(%). Nótese que extracti falla si al menos una de las etiquetas está dañada, quizás debido a haber borrado )., o si algunas entradas procedían de la lectura de ficheros externos (mediante batch), o si existen caracteres más allá de los símbolos de terminación de sentencia ; o $.

 
extracti(file):= block(
   [ s1: openr(file), ifile: sconc(file,".in"), line, nl: false ],
   s2: openw(ifile), 

   while ( stringp(line: readline(s1)) ) do (
      if ssearch( sconc("(",inchar),line ) = 1 then (
         line: strim(" ",substring( line,ssearch(")",line)+1 )),
         printf( s2,"~a~%",line ),
         checklast(line) )
      else if nl then (
         line: strimr(" ",line),
         printf( s2,"~a~%",line ),
         checklast(line) )),
         
   close(s1), close(s2),
   ifile)$
      
checklast(line):= block(
   [ last: charat( line,slength(line) ) ],
   if cequal(last,";") or cequal(last,"$") then 
      nl:false else nl:true )$

Contenido del fichero 'C:\home\maxima\test.out':

 
(%i1) f(x):= sin(x)$
(%i2) diff(f(x),x);
(%o2)                               cos(x)
(%i3) df(x):= ''%;
(%o3)                           df(x) := cos(x)
(%i4) df(0);
(%o4)                                  1

Ahora desde Maxima:

 
(%i11) extracti("C:\\home\\maxima\\test.out");
(%o11)             C:\home\maxima\test.out.in
(%i12) batch(%);

batching #pC:/home/maxima/test.out.in
(%i13)                          f(x) := sin(x)
(%i14)                           diff(f(x), x)
(%o14)                              cos(x)
(%i15)                          df(x) := cos(x)
(%o15)                          df(x) := cos(x)
(%i16)                               df(0)
(%o16)                                 1 

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

67.2 Definiciones para entrada y salida

Ejemplo:

 
(%i1) s: openw("C:\\home\\file.txt");
(%o1)                 #<output stream C:\home\file.txt>
(%i2) control: "~2tAn atom: ~20t~a~%~2tand a list: ~20t~{~r ~}~%~2tand an integer: ~20t~d~%"$
(%i3) printf( s,control, 'true,[1,2,3],42 )$
(%o3)                                false
(%i4) close(s);
(%o4)                                true
(%i5) s: openr("C:\\home\\file.txt");
(%o5)                 #<input stream C:\home\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 el flujo de datos stream.

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 ajusta la posición en stream. El argumento pos debe ser un número positivo, ocupando el primer elemento en 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. La función freshline no trabaja correctamente con los flujos de datos true y false.

Función: newline ()
Función: newline (stream)

Escribe una nueva línea en el flujo de datos stream. La función freshline no trabaja correctamente con los flujos de datos true y false. Véase sprint para un ejemplo de utilización de newline.

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)

La función printf se comporta de forma similar a la de FORMAT en Common Lisp. Véanse las referencias de Lisp para más información. Téngase en cuenta que hay alhunas directivas que funcionan en Lisp, pero no en Maxima. Por ejemplo, ~:[ falla.

La función printf ha sido diseñada para que ~s se interprete igual que ~a. Además la directiva de selección ~[ se indexa a partir del cero.

 
   ~%       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
   ~a       tal como imprime la función de Maxima print
   ~s       como ~a
   ~~       ~
   ~<       justificación, ~> termina
   ~(       conversor mayúscula/minúscula, ~) termina 
   ~[       selección, ~] termina 
   ~{       iteración, ~} termina
 
(%i1) printf( false, "~s ~a ~4f ~a ~@r", 
"String",sym,bound,sqrt(8),144), bound = 1.234;
(%o1)                 String sym 1.23 2*sqrt(2) 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 0 else 1 ), n=2;
(%o5)                    Two birds are singing.

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

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 está al final del fichero.

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

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

 
(%i1) load("stringproc")$
(%i2) for n:0 thru 16 do sprint( fib(n) )$
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Si se quiere un salto de línea antes de cada impresión, añádase ,newline().

Véase ascii para un ejemplo.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

67.3 Definiciones para caracteres

Función: alphacharp (char)

Devuelve true si char es una carácter alfabético.

Función: alphanumericp (char)

Devuelve true si char es una carácter alfabético o un dígito.

Función: ascii (int)

Devuelve el carácter correspondiente al número ASCII int, debiendo ser -1 < int < 256.

 
(%i1) for n from 0 thru 255 do ( tmp: ascii(n),
if alphacharp(tmp) then sprint(tmp) ), newline()$
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g
h i j k l m n o p q r s t u v w x y z
Función: cequal (char_1, char_2)

Devuelve true si char_1 y char_2 son el mismo carácter.

Función: cequalignore (char_1, char_2)

Como cequal, pero ignora si las letras están en mayúsculas o minúsculas.

Función: cgreaterp (char_1, char_2)

Devuelve true si el número ASCII de char_1 es mayor que el de char_2.

Función: cgreaterpignore (char_1, char_2)

Como cgreaterp, pero ignora si las letras están en mayúsculas o minúsculas.

Función: charp (obj)

Devuelve true si obj es un carácter de Maxima.

Función: cint (char)

Devuelve el número ASCII de char.

Función: clessp (char_1, char_2)

Devuelve true si el número ASCII de char_1 es menor que el de char_2.

Función: clesspignore (char_1, char_2)

Como clessp, pero ignora si las letras están en mayúsculas o minúsculas.

Función: constituent (char)

Devuelve true si char es un carácter gráfico y no el carácter espacio. Un carácter gráfico es el que se puede ver y con un espacio añadido; constituent está definido por Paul Graham, ANSI Common Lisp, 1996, page 67.

 
(%i1) for n from 0 thru 255 do ( tmp: ascii(n),
if constituent(tmp) then sprint(tmp) ), newline()$
! " #  %  ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B
C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c
d e f g h i j k l m n o p q r s t u v w x y z { | } ~
Función: cunlisp (lisp_char)

Convierte un carácter Lisp en uno de Maxima. El uso de esta función por parte del usuario no será necesario.

Función: digitcharp (char)

Devuelve true si char es un dígito.

Función: lcharp (obj)

Devuelve true si obj es un carácter de Lisp. El uso de esta función por parte del usuario no será necesario.

Función: lowercasep (char)

Devuelve true si char es un carácter en minúscula.

Variable: newline

El carácter de nueva línea.

Variable: space

El carácter de espacio.

Variable: tab

El carácter de tabulación.

Función: uppercasep (char)

Devuelve true si char es un carácter en mayúscula.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

67.4 Definiciones para cadenas

Función: sunlisp (lisp_string)

Convierte una cadena Lisp en una de Maxima. El uso de esta función por parte del usuario no será necesario.

Función: lstringp (obj)

Devuelve true si obj es una cadena de Lisp. El uso de esta función por parte del usuario no será necesario.

Función: stringp (obj)

Devuelve true si obj es una cadena de Maxima. Véase un ejemplo en la introducción.

Función: charat (string, n)

Devuelve el n-ésimo carácter de string. Al primer carácter de string le corresponde n = 1.

 
(%i1) load("stringproc")$
(%i2) charat("Lisp",1);
(%o2)                           L
Función: charlist (string)

Devuelve una lista con todos los caracteres de string.

 
(%i1) load("stringproc")$
(%i2) charlist("Lisp");
(%o2)                     [L, i, s, p]
(%i3) %[1];
(%o3)                           L
Función: parsetoken (string)

La función parsetoken convierte el primer lexema de string a su forma numérica, devolviendo false si no se puede determinar este número. El conjunto de delimitadores de lexemas es {space, comma, semicolon, tab, newline}.

 
(%i1) load("stringproc")$
(%i2) 2*parsetoken("1.234 5.678");
(%o2)                         2.468

También se puede utilizar la función parse_string para el análisis sintáctico.

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

Evalúa sus argumentos y los yuxtapone para formar una cadena. Esta función es similar a sconcat, pero devuelve una cadena de Maxima.

 
(%i1) load("stringproc")$
(%i2) sconc("xx[",3,"]:",expand((x+y)^3));
(%o2)             xx[3]:y^3+3*x*y^2+3*x^2*y+x^3
(%i3) stringp(%);
(%o3)                         true
Función: scopy (string)

Devuelve una copia nueva de la cadena string.

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

Convierte caracteres en minúscula a mayúscula. Véase también supcase.

Función: sequal (string_1, string_2)

Devuelve true si string_1 y string_2 son dos cadenas de caracteres iguales.

Función: sequalignore (string_1, string_2)

Igual que sequal pero no diferencia entre minúsculas y mayúsculas..

Función: sexplode (string)

El nombre sexplode es un seudónimo de la función charlist.

Función: simplode (list)
Función: simplode (list, delim)

La función simplode admite como entrada una lista de expresiones para luego convertirla en una cadena de caracteres. Si no se utiliza la opción delim para indicar el delimitador, entonces simplode actúa como sconc y no hace uso de ninguno. El valor de delim puede ser cualquier cadena.

 
(%i1) load("stringproc")$
(%i2) simplode(["xx[",3,"]:",expand((x+y)^3)]);
(%o2)             xx[3]:y^3+3*x*y^2+3*x^2*y+x^3
(%i3) simplode( sexplode("stars")," * " );
(%o3)                   s * t * a * r * s
(%i4) simplode( ["One","more","coffee."]," " );
(%o4)                   One more coffee.
Función: sinsert (seq, string, pos)

Devuelve la concatenación de las cadenas substring (string, 1, pos - 1), seq y substring (string, pos). Nótese que al primer carácter de string le corresponde la posición 1.

 
(%i1) load("stringproc")$
(%i2) s: "A submarine."$
(%i3) sconc( substring(s,1,3),"yellow ",substring(s,3) );
(%o3)                  A yellow submarine.
(%i4) sinsert("hollow ",s,3);
(%o4)                  A hollow submarine.
Función: sinvertcase (string)
Función: sinvertcase (string, start)
Función: sinvertcase (string, start, end)

Devuelve la misma cadena string pero con todos sus caracteres desde la posición start hasta end quedan invertidos, esto es, las mayúsculas se convierten en minúsculas y éstas en mayúsculas. Si no se incluye el argumento end, se invierten todos los caracteres desde start hasta el final de la cadena.

 
(%i1) load("stringproc")$
(%i2) sinvertcase("sInvertCase");
(%o2)                      SiNVERTcASE
Función: slength (string)

Devuelve el número de caracteres de string.

Función: smake (num, char)

Construye una cadena de longitud num con todos sus caracteres iguales a char.

 
(%i1) load("stringproc")$
(%i2) smake(3,"w");
(%o2)                          www
Función: smismatch (string_1, string_2)
Función: smismatch (string_1, string_2, test)

Devuelve la posición del primer carácter de string_1 distinto del correpondiente a string_2. La respuesta será false si no existe tal carácter. Por defecto, la función de comparación es sequal. Si se quiere ignorar la diferencia entre mayúsculas y minúsculas, hágase uso de sequalignore para el argumento test.

 
(%i1) load("stringproc")$
(%i2) smismatch("seven","seventh");
(%o2)                           6
Función: split (string)
Función: split (string, delim)
Función: split (string, delim, multiple)

Devuelve la lista de todos los lexemas (tokens) de string. La función split utiliza delim como delimitador, y en caso de no ser utilizado este argumento, será utilizado el espacio en blanco como delimitador por defecto. El argumento multiple es una variable booleana con valor true por defecto. Los delimitadores múltiples se leen como uno solo, lo que resulta de utilidad si las tabulaciones son almacenadas como secuencias de espacios en blanco. Si a multiple se le asigna el valor false, se consirararán todos los delimitadores.

 
(%i1) load("stringproc")$
(%i2) split("1.2   2.3   3.4   4.5");
(%o2)                 [1.2, 2.3, 3.4, 4.5]
(%i3) split("first;;third;fourth",";",false);
(%o3)               [first, , third, fourth]
Función: sposition (char, string)

Devuelve la posición del primer carácter de string que coincide con char. Al primer carácter de string le corresponde la posición 1. Para cuando se quiera ignorar la diferencia entre mayúsculas y minúsculas, véase ssearch.

Función: sremove (seq, string)
Función: sremove (seq, string, test)
Función: sremove (seq, string, test, start)
Función: sremove (seq, string, test, start, end)

Devuelve la cadena string pero sin las subcadenas que coinciden con seq. La función de comparación por defecto es sequal. Si se quiere ignorar la diferencia entre mayúsculas y minúsculas, hágase uso de sequalignore para el argumento test. Utilícense start y end para acotar la búsqueda. Al primer carácter de string le corresponde la posición 1.

 
(%i1) load("stringproc")$
(%i2) sremove("n't","I don't like coffee.");
(%o2)                   I do like coffee.
(%i3) sremove ("DO ",%,'sequalignore);
(%o3)                    I like coffee.
Función: sremovefirst (seq, string)
Función: sremovefirst (seq, string, test)
Función: sremovefirst (seq, string, test, start)
Función: sremovefirst (seq, string, test, start, end)

Actúa de forma similar a la función sremove, pero sólo elimina la primera aparición de la subcadena seq.

Función: sreverse (string)

Devuelve una cadena con todos los caracteres de string en orden inverso.

Función: ssearch (seq, string)
Función: ssearch (seq, string, test)
Función: ssearch (seq, string, test, start)
Función: ssearch (seq, string, test, start, end)

Devuelve la posición de la primera subcadena de string que coincide con la cadena seq. La función de comparación por defecto es sequal. Si se quiere ignorar la diferencia entre mayúsculas y minúsculas, hágase uso de sequalignore para el argumento test. Utilícense start y end para acotar la búsqueda. Al primer carácter de string le corresponde la posición 1.

 
(%i1) ssearch("~s","~{~S ~}~%",'sequalignore);
(%o1)                                  4
Función: ssort (string)
Función: ssort (string, test)

Devuelve una cadena con todos los caracteres de string en un orden tal que no haya dos caracteres sucesivos c y d que verifiquen que test (c, d) sea igual false y test (d, c) igual a true. La función de comparación test por defecto es clessp, siendo el conjunto de posibles valores para este argumento {clessp, clesspignore, cgreaterp, cgreaterpignore, cequal, cequalignore}.

 
(%i1) load("stringproc")$
(%i2) ssort("I don't like Mondays.");
(%o2)                    '.IMaddeiklnnoosty
(%i3) ssort("I don't like Mondays.",'cgreaterpignore);
(%o3)                 ytsoonnMlkIiedda.'   
Función: ssubst (new, old, string)
Función: ssubst (new, old, string, test)
Función: ssubst (new, old, string, test, start)
Función: ssubst (new, old, string, test, start, end)

Devuelve una cadena similar a string pero en la que aquellas subcadenas coincidentes con old han sido sustituidas por new. Las subcadenas old y new no necesitan ser de la misma longitud. La función de comparación por defecto es sequal. Si se quiere ignorar la diferencia entre mayúsculas y minúsculas durante la búsqueda de old, hágase uso de sequalignore para el argumento test. Utilícense start y end para acotar la búsqueda. Al primer carácter de string le corresponde la posición 1.

 
(%i1) load("stringproc")$
(%i2) ssubst("like","hate","I hate Thai food. I hate green tea.");
(%o2)          I like Thai food. I like green tea.
(%i3) ssubst("Indian","thai",%,'sequalignore,8,12);
(%o3)         I like Indian food. I like green tea.
Función: ssubstfirst (new, old, string)
Función: ssubstfirst (new, old, string, test)
Función: ssubstfirst (new, old, string, test, start)
Función: ssubstfirst (new, old, string, test, start, end)

Actúa de forma similar a la función subst, pero sólo hace la sustitución en la primera coincidencia con old.

Función: strim (seq,string)

Devuelve la cadena string pero recortando los caracteres de seq que tuviese en sus extremos.

 
(%i1) load("stringproc")$
(%i2) "/* comment */"$
(%i3) strim(" /*",%);
(%o3)                        comment
(%i4) slength(%);
(%o4)                           7
Función: striml (seq, string)

Actúa de forma similar a strim, pero sólo recorta en el extremo final de string.

Función: strimr (seq, string)

Actúa de forma similar a strim, pero sólo recorta en el extremo inicial de string.

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

Devuelve la subcadena de string que comienza en la posición start y termina en la posición end. El carácter en la posición end no se incluye. En caso de no suministrarse el argumento end, la subcadena se extenderá hasta el final. Al primer carácter de string le corresponde la posición 1.

 
(%i1) load("stringproc")$
(%i2) substring("substring",4);
(%o2)                        string
(%i3) substring(%,4,6);
(%o3)                          in
Función: supcase (string)
Función: supcase (string, start)
Función: supcase (string, start, end)

Devuelve la cadena string con todos sus caracteres entre las posiciones start y end en minúscula transformados a mayúscula. En caso de no suministrarse el argumento end, los cambios se extenderán hasta el final.

 
(%i1) load("stringproc")$
(%i2) supcase("english",1,2);
(%o2)                        English
Función: tokens (string)
Función: tokens (string, test)

Devuelve la lista de todos los lexemas (tokens) de string. Los lexemas son subcadenas cuyos caracteres satisfacen la condición test. Si no se suministra el argumento test, se utilizará la condición constituent, siendo el conjunto de las otras alternativas {constituent, alphacharp, digitcharp, lowercasep, uppercasep, charp, characterp, alphanumericp}.

 
(%i1) load("stringproc")$
(%i2) tokens("24 October 2005");
(%o2)                  [24, October, 2005]
(%i3) tokens("05-10-24",'digitcharp);
(%o3)                     [05, 10, 24]
(%i4) map(parsetoken,%);
(%o4)                      [5, 10, 24]

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by root on octubre, 18 2006 using texi2html 1.76.