[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
77.1 Introducción al procesamiento de cadenas | ||
77.2 Funciones y variables para entrada y salida | ||
77.3 Funciones y variables para caracteres | ||
77.4 Funciones y variables para cadenas |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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 van.nek at arcor.de .
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.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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)$
Cierra el flujo de datos stream y devuelve true
si stream había
sido abierto.
Devuelve el número de elementos en el flujo de datos stream.
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.
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
.
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.
Devuelve un flujo de datos al fichero file.
Si se abre un fichero ya existente, opena
añade elementos al final
del fichero.
Devuelve un flujo de datos de entrada al fichero file. Si file no existe, será creado.
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.
Pone al alcance de Maxima la función FORMAT de Common Lisp.
Véanse las referencias de Lisp para más información.
La siguiente descripción y los ejemplos pueden dar una idea de cómo usar printf
.
~% 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 ~[
está indexada a partir del cero.
Téngase en cuenta que la directiva ~*
no está soportada.
(%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 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.
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.
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 22 do sprint( fib(n) )$ 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 (%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
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Devuelve true
si char es una carácter alfabético.
Devuelve true
si char es una carácter alfabético o
un dígito.
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), if n=96 then 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
Devuelve true
si char_1 y char_2 son el mismo carácter.
Como cequal
, pero ignora si las letras están en mayúsculas o
minúsculas.
Devuelve true
si el número ASCII de char_1 es mayor que el
de char_2.
Como cgreaterp
, pero ignora si las letras están en mayúsculas o
minúsculas.
Devuelve true
si obj es un carácter de Maxima.
Devuelve el número ASCII de char.
Devuelve true
si el número ASCII de char_1 es menor que el
de char_2.
Como clessp
, pero ignora si las letras están en mayúsculas o
minúsculas.
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) )$ ! " # % ' ( ) * + , - . / 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 { | } ~
Convierte un carácter Lisp en uno de Maxima. El uso de esta función por parte del usuario no será necesario.
Devuelve true
si char es un dígito.
Devuelve true
si obj es un carácter de Lisp.
El uso de esta función por parte del usuario no será necesario.
Devuelve true
si char es un carácter en minúscula.
El carácter de nueva línea.
El carácter de espacio.
El carácter de tabulación.
Devuelve true
si char es un carácter en mayúscula.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Devuelve true
si obj es una cadena.
Véase un ejemplo en la introducción.
Devuelve el n-ésimo carácter de string. Al primer carácter de string le corresponde n = 1.
(%i1) charat("Lisp",1); (%o1) L
Devuelve una lista con todos los caracteres de string.
(%i1) charlist("Lisp"); (%o1) [L, i, s, p] (%i2) %[1]; (%o2) L
Analiza sintácticamente la cadena str como una expresión de Maxima
y la evalúa. La cadena str puede terminar o no con cualquiera de los
símbolos de final de sentencia (dólar $
o punto y coma ;
).
Sólo se analiza la primera expresión si hay más de una.
Se emitirá un mensaje de error si str no es una cadena.
Ejemplos:
(%i1) eval_string ("foo: 42; bar: foo^2 + baz"); (%o1) 42 (%i2) eval_string ("(foo: 42, bar: foo^2 + baz)"); (%o2) baz + 1764
Véase también parse_string
.
Analiza sintácticamente la cadena str como una expresión de Maxima,
pero no la evalúa. La cadena str puede terminar o no con cualquiera de los
símbolos de final de sentencia (dólar $
o punto y coma ;
).
Sólo se analiza la primera expresión si hay más de una.
Se emitirá un mensaje de error si str no es una cadena.
Ejemplos:
(%i1) parse_string ("foo: 42; bar: foo^2 + baz"); (%o1) foo : 42 (%i2) parse_string ("(foo: 42, bar: foo^2 + baz)"); 2 (%o2) (foo : 42, bar : foo + baz)
Véase también eval_string
.
Devuelve una copia nueva de la cadena string.
Convierte caracteres en minúscula a mayúscula. Véase también supcase
.
Devuelve true
si string_1 y string_2 son dos cadenas de caracteres iguales.
Igual que sequal
pero no diferencia entre minúsculas y mayúsculas..
El nombre sexplode
es un seudónimo de la función charlist
.
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
no
hace uso de ninguno. El valor de delim puede ser cualquier cadena.
(%i1) simplode(["xx[",3,"]:",expand((x+y)^3)]); (%o1) xx[3]:y^3+3*x*y^2+3*x^2*y+x^3 (%i2) simplode( sexplode("stars")," * " ); (%o2) s * t * a * r * s (%i3) simplode( ["One","more","coffee."]," " ); (%o3) One more coffee.
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) s: "A submarine."$ (%i2) concat( substring(s,1,3),"yellow ",substring(s,3) ); (%o2) A yellow submarine. (%i3) sinsert("hollow ",s,3); (%o3) A hollow submarine.
Devuelve la misma cadena string pero con todos sus caracteres desde la posición start hasta end 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) sinvertcase("sInvertCase"); (%o1) SiNVERTcASE
Devuelve el número de caracteres de string.
Construye una cadena de longitud num con todos sus caracteres iguales a char.
(%i1) smake(3,"w"); (%o1) www
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) smismatch("seven","seventh"); (%o1) 6
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) split("1.2 2.3 3.4 4.5"); (%o1) [1.2, 2.3, 3.4, 4.5] (%i2) split("first;;third;fourth",";",false); (%o2) [first, , third, fourth]
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.
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) sremove("n't","I don't like coffee."); (%o1) I do like coffee. (%i2) sremove ("DO ",%,'sequalignore); (%o2) I like coffee.
Actúa de forma similar a la función sremove
, pero sólo elimina
la primera aparición de la subcadena seq
.
Devuelve una cadena con todos los caracteres de string en orden inverso.
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
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) ssort("I don't like Mondays."); (%o1) '.IMaddeiklnnoosty (%i2) ssort("I don't like Mondays.",'cgreaterpignore); (%o2) ytsoonnMlkIiedda.'
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) ssubst("like","hate","I hate Thai food. I hate green tea."); (%o1) I like Thai food. I like green tea. (%i2) ssubst("Indian","thai",%,'sequalignore,8,12); (%o2) I like Indian food. I like green tea.
Actúa de forma similar a la función subst
, pero sólo hace
la sustitución en la primera coincidencia con old.
Devuelve la cadena string pero recortando los caracteres de seq que tuviese en sus extremos.
(%i1) "/* comment */"$ (%i2) strim(" /*",%); (%o2) comment (%i3) slength(%); (%o3) 7
Actúa de forma similar a strim
, pero sólo recorta
en el extremo final de string.
Actúa de forma similar a strim
, pero sólo recorta
en el extremo inicial de string.
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) substring("substring",4); (%o1) string (%i2) substring(%,4,6); (%o2) in
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) supcase("english",1,2); (%o1) English
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) tokens("24 October 2005"); (%o1) [24, October, 2005] (%i2) tokens("05-10-24",'digitcharp); (%o2) [05, 10, 24] (%i3) map(parse_string,%); (%o3) [5, 10, 24]
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Robert Dodier on agosto, 1 2011 using texi2html 1.76.