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

73.1, Introdução a manipulação de seqüências de caracteres

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

Para esclarecimentos e correções por favor mande um e-mail para van.nek at arcor.de .

No Maxima uma seqüência de caracteres é facilmente contruída digitando "texto" (qualquer texto desejado entre aspas duplas). Note que seqüências de caracteres do Maxima não são seqüências de caracteres do Lisp e vice-versa. stringp realiza testes para seqüências de caracteres do Maxima, e lstringp realiza testes para seqüências de caracteres do Lisp. Se por alguma razão voce tiver um valor, que é uma seqüência de caracteres do Lisp, talvez quando estiver usando a função sconcat do Maxima, você pode converter via sunlisp.

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

Todas as funções em stringproc.lisp, que retornarem seqüências de caracteres, retornam seqüências de caracteres do Maxima.

Caracteres são introduzidos como seqüê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) c: "e";
(%o1)                           e
(%i2) [charp(c),lcharp(c)];
(%o2)                     [true, false]
(%i3) supcase(c);
(%o3)                           E
(%i4) charp(%);
(%o4)                         true

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

É importante saber, que o primeiro caractere em uma seqüência de caracteres do Maxima éstá na posição 1. Isso é designado devido ao fato 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 seqüência de caractere são muitas vezes usadas quando estamos trabalhando com arquivos. Você encontrará algumas úteis funções de fluxo e funções de impressões 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 arquivo, printf então permite escrita formatada para esse arquivo. Veja printf para detalhes.

+(%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

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

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 irá ser disponibilizada para uso automaticamente através de eval_string.lisp.

(%i10) map( parse_string, list );
(%o10)           [42, 1.234, sqrt(2), %pi, 0.01, 0.01, 1.0b-2]
(%i11) float(%);
(%o11) [42.0, 1.234, 1.414213562373095, 3.141592653589793, 0.01, 0.01, 0.01]
(%i12) readline(s);
(%o12)                               false
(%i13) close(s)$

readline retorna false quado o fim de arquivo acontecer.


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