Próximo: , Anterior: , Acima: stringproc   [Conteúdo][Índice]

69.1, Introdução a manipulação de sequências de caracteres

O ficheiro stringproc.lisp amplia a compatibilidade do Maxima de trabalhar com sequências de caracteres e adiciona algumas funções úteis a entrada e saída de dados.

Para esclarecimentos e erros por favor mande um e-mail para van.nek at arcor.de .

Para disponibilizar stringproc.lisp para uso digite load("stringproc");.

No Maxima uma sequência de caracteres é facilmente contruída digitando "texto" (qualquer texto desejado entre aspas duplas). Note que sequências de caracteres do Maxima não são sequências de caracteres do Lisp e vice-versa. Testes podem ser concluídos com stringp e lstringp. Se por alguma razão tiver um valor, que é uma sequência de caracteres do Lisp, talvez quando estiver usando a função sconcat do Maxima, poderá converter via 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 as funções em stringproc.lisp, que retornarem sequências de caracteres, retornam sequências de caracteres do Maxima.

Caracteres são introduzidos como sequências de caracteres do Maxima de comprimento 1. Com certeza, esses caracteres não são caracteres do Lisp. Testes podem ser realizados com charp ( lcharp e conversões do Lisp para o Maxima com 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

Novamente, todas as funções em stringproc.lisp, que retornam caracteres, retornam caracteres do Maxima. devido a esse facto, que os caracteres introduzidos são sequências de caracteres de comprimento 1, pode usar muitas das funções de sequência de caracteres também para caracteres. Como visto, supcase é um exemplo.

É importante saber, que o primeiro caractere em uma sequência de caracteres do Maxima éstá na posição 1. Isso é designado devido ao facto de o primeiro elemento em uma lista do Maxima está na posição 1 também. Veja definições de charat e de charlist para obter exemplos.

Em aplicações fnções de sequência de caractere são muitas vezes usadas quando estamos trabalhando com ficheiros. Poderá encontrará algumas funções úteis de fluxo e de impressão em stringproc.lisp. O seguinte exemplo mostra algumas das funções aqui introduzidas no trabalho.

Exemplo:

openw retorna um fluxo de saída para um ficheiro, printf então permite escrita formatada para esse ficheiro. Veja printf para detalhes.

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

Após fechar o fluxo pode abrí-lo novamente, dessa vez com direção de entrada. readline retorna a linha completa como uma sequência de caracteres. O pacote stringproc agora oferece muitas funções para manipulação de sequências de caracteres. A troca de indicações/fichas pode ser realizada por split ou por tokens.

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

parsetoken somente analiza números inteiros e em ponto flutuante. A análise de símbolos ou grandes números em ponto flutuante precisa de parse_string, que pode ser disponibilizada para uso através de eval_string.lisp.

(%i11) load("eval_string")$
(%i12) map( parse_string, list );
(%o12)           [42, 1.234, sqrt(2), %pi, 0.01, 0.01, 1.0b-2]
(%i13) float(%);
(%o13) [42.0, 1.234, 1.414213562373095, 3.141592653589793, 0.01, 0.01, 0.01]
(%i14) readline(s);
(%o14)                               false
(%i15) close(s)$

readline retorna false quado o fim de ficheiro acontecer.


Próximo: , Anterior: , Acima: stringproc   [Conteúdo][Índice]