Introdução a manipulação de sequências de caracteres (Manual do Maxima 5.45.0)

Próximo: Definições para entrada e saída, Anterior: stringproc, 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: Definições para entrada e saída, Anterior: stringproc, Acima: stringproc [Conteúdo][Índice]