1 @c English version: 2013-08-07
3 * Introducción al procesamiento de cadenas::
4 * Funciones y variables para entrada y salida::
5 * Funciones y variables para caracteres::
6 * Funciones y variables para cadenas::
9 @node Introducción al procesamiento de cadenas, Funciones y variables para entrada y salida, stringproc, stringproc
10 @section Introducción al procesamiento de cadenas
12 El paquete @code{stringproc} amplía las capacidades de
13 Maxima para manipular cadenas de caracteres, al tiempo que añade algunas
14 funciones útiles para la lectura y escritura de ficheros.
16 Para dudas y fallos, por favor contáctese con @code{volkervannek at gmail dot com}.
18 En Maxima, una cadena de caracteres se construye fácilmente
19 escribiéndola entre comillas dobles, como en @code{"texto"}.
20 La función @code{stringp} comprueba si el argumento es una cadena.
33 Los caracteres se representan como cadenas de longitud unidad.
34 No se tratan como caracteres Lisp. Se pueden chequear con la
35 función @code{charp} (o con @code{lcharp} para los caracteres Lisp).
36 La conversión de caracteres Lisp a caracteres Maxima se realiza con
37 la función @code{cunlisp}.
41 @c [charp(c),lcharp(c)];
48 (%i2) [charp(c),lcharp(c)];
56 Todos los caracteres devueltos por las funciones de @code{stringproc} son caracteres
57 de Maxima. Puesto que los caracteres introducidos son cadenas de longitud igual a
58 la unidad, se pueden utilizar las funciones de cadenas también para los
59 caracteres, como se ha hecho con @code{supcase} en el anterior ejemplo.
61 Es importante tener en cuenta que el primer carácter en una cadena de Maxima
62 ocupa la posición 1. Esto se ha diseñado así para mantener
63 la compatibilidad con las listas de Maxima. Véanse las definiciones de
64 @code{charat} y @code{charlist} para ver ejemplos.
66 Las funciones de cadena se utilizan frecuentemente cuando se trabaja con
67 ficheros. El siguiente ejemplo muestra algunas de estas funciones en acción.
71 La función @code{openw} envía un flujo de salida hacia
72 un fichero, entonces @code{printf} permitirá formatera la escritura en
73 este fichero. Véase @code{printf} para más detalles.
76 (%i1) s: openw("E:/file.txt");
77 (%o1) #<output stream E:/file.txt>
78 (%i2) for n:0 thru 10 do printf( s, "~d ", fib(n) );
80 (%i3) printf( s, "~%~d ~f ~a ~a ~f ~e ~a~%",
81 42,1.234,sqrt(2),%pi,1.0e-2,1.0e-2,1.0b-2 );
87 Una vez cerrado el flujo, se podrá abrir nuevamente. La función @code{readline}
88 devuelve el renglón entero como una única cadena. El paquete @code{stringproc}
89 dispone de muchas funciones para manipular cadenas. La separación de palabras se
90 puede hacer con @code{split} o @code{tokens}.
93 (%i5) s: openr("E:/file.txt");
94 (%o5) #<input stream E:/file.txt>
96 (%o6) 0 1 1 2 3 5 8 13 21 34 55
97 (%i7) line: readline(s);
98 (%o7) 42 1.234 sqrt(2) %pi 0.01 1.0E-2 1.0b-2
99 (%i8) list: tokens(line);
100 (%o8) [42, 1.234, sqrt(2), %pi, 0.01, 1.0E-2, 1.0b-2]
101 (%i9) map( parsetoken, list );
102 (%o9) [42, 1.234, false, false, 0.01, 0.01, false]
105 La función @code{parsetoken} sólo analiza sintácticamente números
106 enteros y decimales. El análisis de símbolos y números
107 decimales grandes (@i{big floats}) necesita @code{parse_string}, que se
108 cargar automáticamente desde @code{eval_string.lisp}.
111 (%i5) s: openr("E:/file.txt");
112 (%o5) #<input stream E:/file.txt>
114 (%o6) 0 1 1 2 3 5 8 13 21 34 55
115 (%i7) line: readline(s);
116 (%o7) 42 1.234 sqrt(2) %pi 0.01 1.0E-2 1.0b-2
117 (%i8) list: tokens(line);
118 (%o8) [42, 1.234, sqrt(2), %pi, 0.01, 1.0E-2, 1.0b-2]
119 (%i9) map( parse_string, list );
120 (%o9) [42, 1.234, sqrt(2), %pi, 0.01, 0.01, 1.0b-2]
122 (%o10) [42.0, 1.234, 1.414213562373095, 3.141592653589793, 0.01,
129 La función @code{readline} devuelve @code{false} cuando se alcanza el
133 @node Funciones y variables para entrada y salida, Funciones y variables para caracteres, Introducción al procesamiento de cadenas, stringproc
134 @section Funciones y variables para entrada y salida
139 @c s: openw("E:/file.txt");
141 @c "~2tAn atom: ~20t~a~%~2tand a list: ~20t~@{~r ~@}~%~2tand an integer: ~20t~d~%"$
142 @c printf( s,control, 'true,[1,2,3],42 )$
144 @c s: openr("E:/file.txt");
145 @c while stringp( tmp:readline(s) ) do print(tmp)$
149 (%i1) s: openw("E:/file.txt");
150 (%o1) #<output stream E:/file.txt>
152 "~2tAn atom: ~20t~a~%~2tand a list: ~20t~@{~r ~@}~%~2t\
153 and an integer: ~20t~d~%"$
154 (%i3) printf( s,control, 'true,[1,2,3],42 )$
158 (%i5) s: openr("E:/file.txt");
159 (%o5) #<input stream E:/file.txt>
160 (%i6) while stringp( tmp:readline(s) ) do print(tmp)$
162 and a list: one two three
167 @deffn {Función} close (@var{stream})
168 Cierra el flujo de datos @var{stream} y devuelve @code{true} si @var{stream} había
173 @deffn {Función} flength (@var{stream})
174 Devuelve el número de elementos en @var{stream},
175 el cual debe ser un flujo de datos desde o hacia un fichero.
178 @deffn {Función} fposition (@var{stream})
179 @deffnx {Función} fposition (@var{stream}, @var{pos})
180 Devuelve la posición actual en el flujo de datos @var{stream} si no se utiliza @var{pos}.
181 Si se utiliza @var{pos}, @code{fposition} fija la posición en @var{stream}.
182 @var{stream} debe ser un flujo de datos desde o hacia un fichero y @var{pos}
183 debe ser un entero positivo que hace corresponder al primer elemento de
184 @var{stream} la posición 1.
187 @deffn {Función} freshline ()
188 @deffnx {Función} freshline (@var{stream})
189 Escribe una nueva línea (en el flujo de datos @var{stream})
190 si la posición actual no corresponde al inicio de la línea.
192 Véase también @code{newline}.
196 @deffn {Función} get_output_stream_string (@var{stream})
197 Devuelve una cadena con todos los caracteres presentes en @var{stream},
198 que debe ser un flujo de datos de salida abiero.
199 Los caracteres devueltos son eliminados de @var{stream}.
201 Para un ejemplo, véase @code{make_string_output_stream} .
205 @deffn {Función} make_string_input_stream (@var{string})
206 @deffnx {Función} make_string_input_stream (@var{string}, @var{start})
207 @deffnx {Función} make_string_input_stream (@var{string}, @var{start}, @var{end})
208 Devuelve un flujo de entrada que contiene partes de @var{string} junto con
209 el carácter de final de fichero. Sin argumentos opcionales, el flujo contiene
210 la cadena entera y se posiciona frente al primer carácter.
211 Los argumentos @var{start} y @var{end} definen la subcadena contenida en el
212 flujo. El primer carácter está disponible en la posición 1.
217 (%i1) istream : make_string_input_stream("text", 1, 4);
218 (%o1) #<string-input stream from "text">
219 (%i2) (while (c : readchar(istream)) # false do sprint(c), newline())$
221 (%i3) close(istream)$
227 @deffn {Función} make_string_output_stream ()
228 Devuelve un flujo de salida que acepta caracteres. Los caracteres de
229 este flujo podrán obtenerse con @code{get_output_stream_string}.
234 (%i1) ostream : make_string_output_stream();
235 (%o1) #<string-output stream 09622ea0>
236 (%i2) printf(ostream, "foo")$
238 (%i3) printf(ostream, "bar")$
240 (%i4) string : get_output_stream_string(ostream);
242 (%i5) printf(ostream, "baz")$
244 (%i6) string : get_output_stream_string(ostream);
246 (%i7) close(ostream)$
252 @deffn {Función} newline ()
253 @deffnx {Función} newline (@var{stream})
254 Escribe una nueva línea (en el flujo de datos @var{stream}).
256 Véase @code{sprint} para un ejemplo de uso de @code{newline()}.
258 Nótese que hay algunos casos en los que @code{newline} no trabaja
263 @deffn {Función} opena (@var{file})
264 Devuelve un flujo de datos al fichero @var{file}.
265 Si se abre un fichero ya existente, @code{opena} añade elementos al final
270 @deffn {Función} openr (@var{file})
271 Devuelve un flujo de datos de entrada al fichero @var{file}.
272 Si @var{file} no existe, será creado.
275 @deffn {Función} openw (@var{file})
276 Devuelve un flujo de datos de salida al fichero @var{file}.
277 Si @var{file} no existe, será creado.
278 Si se abre un fichero ya existente, @code{openw} lo modifica
279 borrando el contenido anterior.
282 @deffn {Función} printf (@var{dest}, @var{string})
283 @deffnx {Función} printf (@var{dest}, @var{string}, @var{expr_1}, ..., @var{expr_n})
284 Genera una cadena de caracteres a partir de la cadena de control @var{string},
285 teniendo en cuenta que las tildes introducen directivas. El carácter que
286 va después de la tilde, posiblemente precedido por parámetros y modificadores,
287 especifica el tipo de formato que se desea. La mayor parte de las directivas usan
288 uno o más elementos de los argumentos @var{expr_1}, ..., @var{expr_n}
289 para crear la salida.
291 Si @var{dest} es un flujo o vale @code{true}, entonces @code{printf} devuelve @code{false}.
292 En otro caso, @code{printf} devuelve una cadena conteniendo la salida.
294 @code{printf} da acceso a la función @code{format} de Common Lisp.
295 El siguiente ejemplo muestra la relación entre estas dos funciones.
298 (%i1) printf(true, "R~dD~d~%", 2, 2);
301 (%i2) :lisp (format t "R~dD~d~%" 2 2)
306 La siguiente descripción es un simple resumen de las posibilidades de @code{printf}.
307 La función @code{format} de Common Lisp se encuentra descrita en detalle en muchas
308 referencias, como el manual libre "Common Lisp the Language" de Guy L. Steele; en
309 particular, el capítulo 22.3.3.
316 ~d entero en base decimal
317 ~b entero en base binaria
318 ~o entero en base octal
319 ~x entero en base hexadecimal
321 ~r deletrea un entero
323 ~f decimal en coma flotante
324 ~e notación científica
325 ~g ~f o ~e, dependiendo de la magnitud
326 ~h número decimal grande (@i{bigfloat})
327 ~a utiliza la función @code{string} de Maxima
328 ~s como ~a, pero las cadenas se devuelven entre "comillas dobles"
330 ~< justificación, ~> termina
331 ~( conversor mayúscula/minúscula, ~) termina
332 ~[ selección, ~] termina
333 ~@{ iteración, ~@} termina
336 La directiva @code{~h} para números decimales grandes no pertenece al estándar
337 de Lisp, por lo que se ilustra más abajo.
339 La directiva @code{~*} no está soportada.
343 Si @var{dest} es un flujo o vale @code{true}, entonces @code{printf} devuelve @code{false}.
344 En otro caso, @code{printf} devuelve una cadena conteniendo la salida.
347 @c printf( false, "~a ~a ~4f ~a ~@@r",
348 @c "String",sym,bound,sqrt(12),144), bound = 1.234;
349 @c printf( false,"~@{~a ~@}",["one",2,"THREE"] );
350 @c printf( true,"~@{~@{~9,1f ~@}~%~@}",mat ),
351 @c mat = args( matrix([1.1,2,3.33],[4,5,6],[7,8.88,9]) )$
352 @c control: "~:(~r~) bird~p ~[is~;are~] singing."$
353 @c printf( false,control, n,n,if n=1 then 1 else 2 ), n=2;
356 (%i1) printf( false, "~a ~a ~4f ~a ~@@r",
357 "String",sym,bound,sqrt(12),144), bound = 1.234;
358 (%o1) String sym 1.23 2*sqrt(3) CXLIV
359 (%i2) printf( false,"~@{~a ~@}",["one",2,"THREE"] );
361 (%i3) printf(true,"~@{~@{~9,1f ~@}~%~@}",mat ),
362 mat = args(matrix([1.1,2,3.33],[4,5,6],[7,8.88,9]))$
366 (%i4) control: "~:(~r~) bird~p ~[is~;are~] singing."$
367 (%i5) printf( false,control, n,n,if n=1 then 1 else 2 ), n=2;
368 (%o5) Two birds are singing.
371 La directiva @code{~h} se ha introducido para formatear decimales grandes.
376 d : decimal digits behind floating point
377 e : minimal exponent digits
378 x : preferred exponent
379 o : overflow character
380 p : padding character
381 @@ : display sign for positive numbers
386 (%i2) printf(true, "|~h|~%", 2.b0^-64)$
387 |0.0000000000000000000542101086242752217003726400434970855712890625|
389 (%i4) printf(true, "|~h|~%", sqrt(2))$
390 |1.4142135623730950488016887|
392 (%i6) printf(true, "|~h|~%", sqrt(2))$
393 |1.41421356237309504880169|
394 (%i7) printf(true, "|~28h|~%", sqrt(2))$
395 | 1.41421356237309504880169|
396 (%i8) printf(true, "|~28,,,,,'*h|~%", sqrt(2))$
397 |***1.41421356237309504880169|
398 (%i9) printf(true, "|~,18h|~%", sqrt(2))$
399 |1.414213562373095049|
400 (%i10) printf(true, "|~,,,-3h|~%", sqrt(2))$
401 |1414.21356237309504880169b-3|
402 (%i11) printf(true, "|~,,2,-3h|~%", sqrt(2))$
403 |1414.21356237309504880169b-03|
404 (%i12) printf(true, "|~20h|~%", sqrt(2))$
405 |1.41421356237309504880169|
406 (%i13) printf(true, "|~20,,,,'+h|~%", sqrt(2))$
407 |++++++++++++++++++++|
413 @deffn {Función} readchar (@var{stream})
414 Elimina y devuelve el primer carácter de @var{stream}.
415 Si se ha alcanzado el final del fichero, @code{readchar} devuelve @code{false}.
417 Para un ejemplo, véase @code{make_string_input_stream}.
421 @deffn {Función} readline (@var{stream})
422 Devuelve una cadena con los caracteres desde la posición actual en el flujo
423 de datos @var{stream} hasta el final de la línea, o @code{false}
424 si se ha alcanzado el final del fichero.
427 @deffn {Función} sprint (@var{expr_1}, ..., @var{expr_n})
428 Evalúa y muestra sus argumentos uno tras otro en un renglón comenzando por
429 su extremo izquierdo.
431 La función @code{newline()}, que se carga automáticamente desde @code{stringproc.lisp},
432 puede ser de utilidad si se quiere intercalar un salto de línea.
435 @c for n:0 thru 19 do sprint( fib(n) )$
436 @c for n:0 thru 22 do (
437 @c sprint(fib(n)), if mod(n,10)=9 then newline() )$
440 (%i1) for n:0 thru 19 do sprint( fib(n) )$
441 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
442 (%i2) for n:0 thru 22 do (
443 sprint(fib(n)), if mod(n,10)=9 then newline() )$
444 0 1 1 2 3 5 8 13 21 34
445 55 89 144 233 377 610 987 1597 2584 4181
451 @node Funciones y variables para caracteres, Funciones y variables para cadenas, Funciones y variables para entrada y salida, stringproc
452 @section Funciones y variables para caracteres
454 @deffn {Función} alphacharp (@var{char})
455 Devuelve @code{true} si @var{char} es una carácter alfabético.
458 @deffn {Función} alphanumericp (@var{char})
459 Devuelve @code{true} si @var{char} es una carácter alfabético o
463 @deffn {Función} ascii (@var{int})
464 Devuelve el carácter correspondiente al número ASCII @var{int},
465 debiendo ser @math{-1 < int < 256}.
468 @c for n from 0 thru 255 do (
470 @c if alphacharp(tmp) then sprint(tmp), if n=96 then newline() )$
473 (%i1) for n from 0 thru 255 do (
475 if alphacharp(tmp) then sprint(tmp), if n=96 then newline() )$
476 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
477 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
482 @deffn {Función} cequal (@var{char_1}, @var{char_2})
483 Devuelve @code{true} si @var{char_1} y @var{char_2} son el mismo carácter.
486 @deffn {Función} cequalignore (@var{char_1}, @var{char_2})
487 Como @code{cequal}, pero ignora si las letras están en mayúsculas o
491 @deffn {Función} cgreaterp (@var{char_1}, @var{char_2})
492 Devuelve @code{true} si el número ASCII de @var{char_1} es mayor que el
496 @deffn {Función} cgreaterpignore (@var{char_1}, @var{char_2})
497 Como @code{cgreaterp}, pero ignora si las letras están en mayúsculas o
501 @deffn {Función} charp (@var{obj})
502 Devuelve @code{true} si @var{obj} es un carácter de Maxima.
505 @deffn {Función} cint (@var{char})
506 Devuelve el número ASCII de @var{char}.
509 @deffn {Función} clessp (@var{char_1}, @var{char_2})
510 Devuelve @code{true} si el número ASCII de @var{char_1} es menor que el
514 @deffn {Función} clesspignore (@var{char_1}, @var{char_2})
515 Como @code{clessp}, pero ignora si las letras están en mayúsculas o
519 @deffn {Función} constituent (@var{char})
520 Devuelve @code{true} si @var{char} es un carácter gráfico y no el
521 carácter espacio. Un carácter gráfico es el que se puede ver y con un
522 espacio añadido; @code{constituent} está definido por Paul Graham,
523 ANSI Common Lisp, 1996, page 67.
526 @c for n from 0 thru 255 do (
527 @c tmp: ascii(n), if constituent(tmp) then sprint(tmp) )$
530 (%i1) for n from 0 thru 255 do (
531 tmp: ascii(n), if constituent(tmp) then sprint(tmp) )$
532 ! " # % ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @@ A B
533 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
534 d e f g h i j k l m n o p q r s t u v w x y z @{ | @} ~
539 @deffn {Función} cunlisp (@var{lisp_char})
540 Convierte un carácter Lisp en uno de Maxima. El uso de esta función por
541 parte del usuario no será necesario.
544 @deffn {Función} digitcharp (@var{char})
545 Devuelve @code{true} si @var{char} es un dígito.
548 @deffn {Función} lcharp (@var{obj})
549 Devuelve @code{true} si @var{obj} es un carácter de Lisp.
550 El uso de esta función por parte del usuario no será necesario.
553 @deffn {Función} lowercasep (@var{char})
554 Devuelve @code{true} si @var{char} es un carácter en minúscula.
557 @defvr {Variable} newline
558 El carácter de nueva línea.
561 @defvr {Variable} space
562 El carácter de espacio.
565 @defvr {Variable} tab
566 El carácter de tabulación.
569 @deffn {Función} uppercasep (@var{char})
570 Devuelve @code{true} si @var{char} es un carácter en mayúscula.
573 @node Funciones y variables para cadenas, , Funciones y variables para caracteres, stringproc
574 @section Funciones y variables para cadenas
578 @deffn {Función} base64 (@var{string})
579 Devuelve la representación en base 64 de @var{string} en formato de
580 cadena de caracteres.
585 (%i1) base64 : base64("foo bar baz");
586 (%o1) Zm9vIGJhciBiYXo=
587 (%i2) string : base64_decode(base64);
593 @deffn {Función} base64_decode (@var{base64-string})
594 Decodifica la cadena de caracteres @var{base64-string}, codificada
595 en base 64, y devuelve la cadena original.
597 Para un ejemplo, véase @code{base64}.
601 @deffn {Función} charat (@var{string}, @var{n})
602 Devuelve el @var{n}-ésimo carácter de @var{string}.
603 Al primer carácter de @var{string} le corresponde @var{n} = 1.
609 (%i1) charat("Lisp",1);
615 @deffn {Función} charlist (@var{string})
616 Devuelve una lista con todos los caracteres de @var{string}.
623 (%i1) charlist("Lisp");
631 @deffn {Función} eval_string (@var{str})
632 Analiza sintácticamente la cadena @var{str} como una expresión de Maxima
633 y la evalúa. La cadena @var{str} puede terminar o no con cualquiera de los
634 símbolos de final de sentencia (dólar @code{$} o punto y coma @code{;}).
635 Sólo se analiza la primera expresión si hay más de una.
637 Se emitirá un mensaje de error si @var{str} no es una cadena.
642 @c eval_string ("foo: 42; bar: foo^2 + baz");
643 @c eval_string ("(foo: 42, bar: foo^2 + baz)");
646 (%i1) eval_string ("foo: 42; bar: foo^2 + baz");
648 (%i2) eval_string ("(foo: 42, bar: foo^2 + baz)");
652 Véase también @code{parse_string}.
659 @deffn {Función} md5sum (@var{string})
660 Devuelve, en formato de cadena de caracteres, el resultado de la suma de verificación
661 md5 del argumento @var{string}. Para obtener el valor devuelto por la función como
662 número entero, fijar la base numérica de entrada a 16 y a~nadir como prefijo
668 (%i1) string : md5sum("foo bar baz");
669 (%o1) ab07acbb1e496801937adfa772424bf7
670 (%i2) ibase : obase : 16.$
672 (%i3) integer : parse_string(sconcat(0, string));
673 (%o3) 0ab07acbb1e496801937adfa772424bf7
682 @deffn {Función} parse_string (@var{str})
683 Analiza sintácticamente la cadena @var{str} como una expresión de Maxima,
684 pero no la evalúa. La cadena @var{str} puede terminar o no con cualquiera de los
685 símbolos de final de sentencia (dólar @code{$} o punto y coma @code{;}).
686 Sólo se analiza la primera expresión si hay más de una.
688 Se emitirá un mensaje de error si @var{str} no es una cadena.
693 @c parse_string ("foo: 42; bar: foo^2 + baz");
694 @c parse_string ("(foo: 42, bar: foo^2 + baz)");
697 (%i1) parse_string ("foo: 42; bar: foo^2 + baz");
699 (%i2) parse_string ("(foo: 42, bar: foo^2 + baz)");
701 (%o2) (foo : 42, bar : foo + baz)
704 Véase también @code{eval_string}.
707 @deffn {Función} scopy (@var{string})
708 Devuelve una copia nueva de la cadena @var{string}.
711 @deffn {Función} sdowncase (@var{string})
712 @deffnx {Función} sdowncase (@var{string}, @var{start})
713 @deffnx {Función} sdowncase (@var{string}, @var{start}, @var{end})
714 Convierte caracteres en minúscula a mayúscula. Véase también @code{supcase}.
717 @deffn {Función} sequal (@var{string_1}, @var{string_2})
718 Devuelve @code{true} si @var{string_1} y @var{string_2} son dos cadenas de caracteres iguales.
722 @deffn {Función} sequalignore (@var{string_1}, @var{string_2})
723 Igual que @code{sequal} pero no diferencia entre minúsculas y mayúsculas..
727 @deffn {Función} sexplode (@var{string})
728 El nombre @code{sexplode} es un seudónimo de la función @code{charlist}.
732 @deffn {Función} simplode (@var{list})
733 @deffnx {Función} simplode (@var{list}, @var{delim})
734 La función @code{simplode} admite como entrada una lista de expresiones para
735 luego convertirla en una cadena de caracteres. Si no se utiliza la opción @var{delim}
736 para indicar el delimitador, entonces @code{simplode} no
737 hace uso de ninguno. El valor de @var{delim} puede ser cualquier cadena.
740 @c simplode(["xx[",3,"]:",expand((x+y)^3)]);
741 @c simplode( sexplode("stars")," * " );
742 @c simplode( ["One","more","coffee."]," " );
745 (%i1) simplode(["xx[",3,"]:",expand((x+y)^3)]);
746 (%o1) xx[3]:y^3+3*x*y^2+3*x^2*y+x^3
747 (%i2) simplode( sexplode("stars")," * " );
748 (%o2) s * t * a * r * s
749 (%i3) simplode( ["One","more","coffee."]," " );
750 (%o3) One more coffee.
755 @deffn {Función} sinsert (@var{seq}, @var{string}, @var{pos})
756 Devuelve la concatenación de las cadenas @code{substring (@var{string}, 1, @var{pos} - 1)},
757 @var{seq} y @code{substring (@var{string}, @var{pos})}.
758 Nótese que al primer carácter de @var{string} le corresponde la posición 1.
761 @c s: "A submarine."$
762 @c concat( substring(s,1,3),"yellow ",substring(s,3) );
763 @c sinsert("hollow ",s,3);
766 (%i1) s: "A submarine."$
767 (%i2) concat( substring(s,1,3),"yellow ",substring(s,3) );
768 (%o2) A yellow submarine.
769 (%i3) sinsert("hollow ",s,3);
770 (%o3) A hollow submarine.
775 @deffn {Función} sinvertcase (@var{string})
776 @deffnx {Función} sinvertcase (@var{string}, @var{start})
777 @deffnx {Función} sinvertcase (@var{string}, @var{start}, @var{end})
778 Devuelve la misma cadena @var{string} pero con todos sus caracteres desde la
779 posición @var{start} hasta @var{end} invertidos, esto es, las
780 mayúsculas se convierten en minúsculas y éstas en mayúsculas.
781 Si no se incluye el argumento @var{end}, se invierten todos los caracteres
782 desde @var{start} hasta el final de la cadena.
786 @c sinvertcase("sInvertCase");
789 (%i1) sinvertcase("sInvertCase");
795 @deffn {Función} slength (@var{string})
796 Devuelve el número de caracteres de @var{string}.
800 @deffn {Función} smake (@var{num}, @var{char})
801 Construye una cadena de longitud @var{num} con todos sus
802 caracteres iguales a @var{char}.
814 @deffn {Función} smismatch (@var{string_1}, @var{string_2})
815 @deffnx {Función} smismatch (@var{string_1}, @var{string_2}, @var{test})
816 Devuelve la posición del primer carácter de @var{string_1} distinto del
817 correpondiente a @var{string_2}. La respuesta será @code{false} si no existe
818 tal carácter. Por defecto, la función de comparación es @code{sequal}.
819 Si se quiere ignorar la diferencia entre mayúsculas y minúsculas, hágase uso de
820 @code{sequalignore} para el argumento @var{test}.
823 @c smismatch("seven","seventh");
826 (%i1) smismatch("seven","seventh");
832 @deffn {Función} split (@var{string})
833 @deffnx {Función} split (@var{string}, @var{delim})
834 @deffnx {Función} split (@var{string}, @var{delim}, @var{multiple})
835 Devuelve la lista de todos los lexemas (@i{tokens}) de @var{string}.
836 La función @code{split} utiliza @var{delim} como delimitador, y en caso
837 de no ser utilizado este argumento, será utilizado el espacio en blanco
838 como delimitador por defecto. El argumento @var{multiple} es una variable
839 booleana con valor @code{true} por defecto. Los delimitadores múltiples
840 se leen como uno solo, lo que resulta de utilidad si las tabulaciones son
841 almacenadas como secuencias de espacios en blanco. Si a @var{multiple} se
842 le asigna el valor @code{false}, se consirararán todos los delimitadores.
845 @c split("1.2 2.3 3.4 4.5");
846 @c split("first;;third;fourth",";",false);
849 (%i1) split("1.2 2.3 3.4 4.5");
850 (%o1) [1.2, 2.3, 3.4, 4.5]
851 (%i2) split("first;;third;fourth",";",false);
852 (%o2) [first, , third, fourth]
857 @deffn {Función} sposition (@var{char}, @var{string})
858 Devuelve la posición del primer carácter de @var{string} que
859 coincide con @var{char}. Al primer carácter de @var{string}
860 le corresponde la posición 1.
861 Para cuando se quiera ignorar la diferencia entre mayúsculas y
862 minúsculas, véase @var{ssearch}.
865 @deffn {Función} sremove (@var{seq}, @var{string})
866 @deffnx {Función} sremove (@var{seq}, @var{string}, @var{test})
867 @deffnx {Función} sremove (@var{seq}, @var{string}, @var{test}, @var{start})
868 @deffnx {Función} sremove (@var{seq}, @var{string}, @var{test}, @var{start}, @var{end})
869 Devuelve la cadena @var{string} pero sin las subcadenas que coinciden con @var{seq}.
870 La función de comparación por defecto es @code{sequal}.
871 Si se quiere ignorar la diferencia entre mayúsculas y minúsculas, hágase uso de
872 @code{sequalignore} para el argumento @var{test}.
873 Utilícense @var{start} y @var{end} para acotar la búsqueda.
874 Al primer carácter de @var{string} le corresponde la posición 1.
877 @c sremove("n't","I don't like coffee.");
878 @c sremove ("DO ",%,'sequalignore);
881 (%i1) sremove("n't","I don't like coffee.");
882 (%o1) I do like coffee.
883 (%i2) sremove ("DO ",%,'sequalignore);
889 @deffn {Función} sremovefirst (@var{seq}, @var{string})
890 @deffnx {Función} sremovefirst (@var{seq}, @var{string}, @var{test})
891 @deffnx {Función} sremovefirst (@var{seq}, @var{string}, @var{test}, @var{start})
892 @deffnx {Función} sremovefirst (@var{seq}, @var{string}, @var{test}, @var{start}, @var{end})
893 Actúa de forma similar a la función @code{sremove}, pero sólo elimina
894 la primera aparición de la subcadena @code{seq}.
898 @deffn {Función} sreverse (@var{string})
899 Devuelve una cadena con todos los caracteres de @var{string} en orden inverso.
903 @deffn {Función} ssearch (@var{seq}, @var{string})
904 @deffnx {Función} ssearch (@var{seq}, @var{string}, @var{test})
905 @deffnx {Función} ssearch (@var{seq}, @var{string}, @var{test}, @var{start})
906 @deffnx {Función} ssearch (@var{seq}, @var{string}, @var{test}, @var{start}, @var{end})
907 Devuelve la posición de la primera subcadena de @var{string} que coincide con
909 La función de comparación por defecto es @code{sequal}.
910 Si se quiere ignorar la diferencia entre mayúsculas y minúsculas, hágase uso de
911 @code{sequalignore} para el argumento @var{test}.
912 Utilícense @var{start} y @var{end} para acotar la búsqueda.
913 Al primer carácter de @var{string} le corresponde la posición 1.
916 (%i1) ssearch("~s","~@{~S ~@}~%",'sequalignore);
922 @deffn {Función} ssort (@var{string})
923 @deffnx {Función} ssort (@var{string}, @var{test})
924 Devuelve una cadena con todos los caracteres de @var{string} en un orden
925 tal que no haya dos caracteres sucesivos @var{c} y @var{d} que verifiquen
926 que @code{test (@var{c}, @var{d})} sea igual @code{false} y
927 @code{test (@var{d}, @var{c})} igual a @code{true}.
928 La función de comparación @var{test} por defecto es @var{clessp}, siendo
929 el conjunto de posibles valores para este argumento
930 @code{@{clessp, clesspignore, cgreaterp, cgreaterpignore, cequal, cequalignore@}}.
933 @c ssort("I don't like Mondays.");
934 @c ssort("I don't like Mondays.",'cgreaterpignore);
937 (%i1) ssort("I don't like Mondays.");
938 (%o1) '.IMaddeiklnnoosty
939 (%i2) ssort("I don't like Mondays.",'cgreaterpignore);
940 (%o2) ytsoonnMlkIiedda.'
945 @deffn {Función} ssubst (@var{new}, @var{old}, @var{string})
946 @deffnx {Función} ssubst (@var{new}, @var{old}, @var{string}, @var{test})
947 @deffnx {Función} ssubst (@var{new}, @var{old}, @var{string}, @var{test}, @var{start})
948 @deffnx {Función} ssubst (@var{new}, @var{old}, @var{string}, @var{test}, @var{start}, @var{end})
949 Devuelve una cadena similar a @var{string} pero en la que aquellas subcadenas
950 coincidentes con @var{old} han sido sustituidas por @var{new}. Las subcadenas
951 @var{old} y @var{new} no necesitan ser de la misma longitud.
952 La función de comparación por defecto es @code{sequal}.
953 Si se quiere ignorar la diferencia entre mayúsculas y minúsculas durante
954 la búsqueda de @var{old}, hágase uso de
955 @code{sequalignore} para el argumento @var{test}.
956 Utilícense @var{start} y @var{end} para acotar la búsqueda.
957 Al primer carácter de @var{string} le corresponde la posición 1.
960 @c ssubst("like","hate","I hate Thai food. I hate green tea.");
961 @c ssubst("Indian","thai",%,'sequalignore,8,12);
964 (%i1) ssubst("like","hate","I hate Thai food. I hate green tea.");
965 (%o1) I like Thai food. I like green tea.
966 (%i2) ssubst("Indian","thai",%,'sequalignore,8,12);
967 (%o2) I like Indian food. I like green tea.
972 @deffn {Función} ssubstfirst (@var{new}, @var{old}, @var{string})
973 @deffnx {Función} ssubstfirst (@var{new}, @var{old}, @var{string}, @var{test})
974 @deffnx {Función} ssubstfirst (@var{new}, @var{old}, @var{string}, @var{test}, @var{start})
975 @deffnx {Función} ssubstfirst (@var{new}, @var{old}, @var{string}, @var{test}, @var{start}, @var{end})
976 Actúa de forma similar a la función @code{subst}, pero sólo hace
977 la sustitución en la primera coincidencia con @var{old}.
980 @deffn {Función} strim (@var{seq},@var{string})
981 Devuelve la cadena @var{string} pero recortando los caracteres
982 de @var{seq} que tuviese en sus extremos.
990 (%i1) "/* comment */"$
991 (%i2) strim(" /*",%);
999 @deffn {Función} striml (@var{seq}, @var{string})
1000 Actúa de forma similar a @code{strim}, pero sólo recorta
1001 en el extremo final de @var{string}.
1004 @deffn {Función} strimr (@var{seq}, @var{string})
1005 Actúa de forma similar a @code{strim}, pero sólo recorta
1006 en el extremo inicial de @var{string}.
1009 @deffn {Función} stringp (@var{obj})
1010 Devuelve @code{true} si @var{obj} es una cadena.
1011 Véase un ejemplo en la introducción.
1014 @deffn {Función} substring (@var{string}, @var{start})
1015 @deffnx {Función} substring (@var{string}, @var{start}, @var{end})
1016 Devuelve la subcadena de @var{string} que comienza en la posición
1017 @var{start} y termina en la posición @var{end}.
1018 El carácter en la posición @var{end} no se incluye.
1019 En caso de no suministrarse el argumento @var{end}, la subcadena
1020 se extenderá hasta el final.
1021 Al primer carácter de @var{string} le corresponde la posición 1.
1024 @c substring("substring",4);
1025 @c substring(%,4,6);
1028 (%i1) substring("substring",4);
1030 (%i2) substring(%,4,6);
1037 @deffn {Función} supcase (@var{string})
1038 @deffnx {Función} supcase (@var{string}, @var{start})
1039 @deffnx {Función} supcase (@var{string}, @var{start}, @var{end})
1040 Devuelve la cadena @var{string} con todos sus caracteres entre las posiciones
1041 @var{start} y @var{end} en minúscula transformados a mayúscula.
1042 En caso de no suministrarse el argumento @var{end}, los cambios
1043 se extenderán hasta el final.
1046 @c supcase("english",1,2);
1049 (%i1) supcase("english",1,2);
1055 @deffn {Función} tokens (@var{string})
1056 @deffnx {Función} tokens (@var{string}, @var{test})
1057 Devuelve la lista de todos los lexemas (@i{tokens}) de @var{string}.
1058 Los lexemas son subcadenas cuyos caracteres satisfacen la condición @var{test}.
1059 Si no se suministra el argumento @var{test}, se utilizará la condición
1060 @var{constituent}, siendo el conjunto de las otras alternativas
1061 @code{@{constituent, alphacharp, digitcharp, lowercasep, uppercasep, charp, characterp, alphanumericp@}}.
1064 @c tokens("24 October 2005");
1065 @c tokens("05-10-24",'digitcharp);
1066 @c map(parse_string,%);
1069 (%i1) tokens("24 October 2005");
1070 (%o1) [24, October, 2005]
1071 (%i2) tokens("05-10-24",'digitcharp);
1073 (%i3) map(parse_string,%);