Next: Funções e Variáveis para entrada e saída, Previous: stringproc, Up: stringproc [Contents][Index]

### 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.

Next: Funções e Variáveis para entrada e saída, Previous: stringproc, Up: stringproc [Contents][Index]