Acresentados nomes curtos:
l : leitura
lb : leitura binária
l+ : leitura e escrita
l+b : leitura e escrita binária
e : escrita
eb : escrita binária
e+ : escrita e leitura
e+b : escrita e leitura binária
a : adição sem apagar o conteúdo atual do arquivo.
a+ : leitura e adição de conteúdo sem apagar o conteúdo atual;
a+b : leitura e adição binária (sem apagar)
Modos anteriores permanecem:
leitura : leitura
leiturabin : leitura binária
leitura+bin : leitura e escrita binária
escrita : escrita
escritabin : escrita binária
escrita+bin : escrita e leitura binária
adicao : adição de conteúdo sem apagar o conteúdo atual do arquivo.
adição : mesmo que o de cima com acentos
adicaobin : adição binária sem apagar o conteúdo
adiçãobin : mesmo de cima com acentos
adicao+ : leitura e adição sem apagar o conteúdo
adição+ : mesmo que o de cima com acentos
adicao+bin : leitura e adição binária sem apagar o conteúdo
adição+bin : mesmo de cima com acentos.
local a, err = es.abra('arq.txt', 'lb'); //abre um arquivo em leitura binária se tipo(a) == 'arquivo' entao imprima('arquivo aberto com sucesso') senao erro(err) fim
1 2 3 4 5 6
local a, err = es.abra('arq.txt', 'lb'); //abre um arquivo em leitura binária se tipo(a) == 'arquivo' entao imprima('arquivo aberto com sucesso') senao erro(err) fim
modos aceitos:
leitura : direciona a saída do programa aberto para a entrada do programa atual prisma
escrita : direciona a saída do programa atual prisma para a entrada do programa aberto
Modos curtos aceitos:
l : leitura
e : escrita
//Teste string.apare(); local s = ' ola mundo! '; imprima( '>' .. string.apare(s) .. '<' ); s = '';//string vazia imprima('>' .. s:apare() .. '<'); //podemos usar o método apare na própria string. s = ' '; //string com somente espaços. imprima('>' .. s:apare() .. '<' );
1 2 3 4 5 6 7 8 9 10
//Teste string.apare(); local s = ' ola mundo! '; imprima( '>' .. string.apare(s) .. '<' ); s = '';//string vazia imprima('>' .. s:apare() .. '<'); //podemos usar o método apare na própria string. s = ' '; //string com somente espaços. imprima('>' .. s:apare() .. '<' );
Saída:
>ola mundo!<
><
><
Quando um indice é maior que o tamanho da string ou menor que 1, o retorno é uma string vazia, mesmo comportamento de string.corte();
Porém não é possível mudar o valor apenas obtê-lo:
s[1] = 'A'; --> erro!
1
s[1] = 'A'; --> erro!
Obs.: *Os [, ...] - indica que aceita mais parâmetros opcionais.
É possível usar a função V() com tipos definidos pelo usuário, a partir do metamétodo __tipo();
local ret = retangulo:novo(); local ret2 = retangulo:novo(); V('retangulo', ret, ret2);
1 2 3
local ret = retangulo:novo(); local ret2 = retangulo:novo(); V('retangulo', ret, ret2);
Obs.: caso o programador tenha definido o metamétodo __tipo() para retornar 'retangulo' dará certo, senão aparecerá uma mensagem de erro e o programa será finalizado.
funcao somar(a,b) retorne N(a) + N(b); //caso a ou b não seja número, o programa é finalizado com erro. fim
1 2 3
funcao somar(a,b) retorne N(a) + N(b); //caso a ou b não seja número, o programa é finalizado com erro. fim
local a,err = es.abra('file.txt', 'leitura'); imprima(tipo(a)); //----> arquivo local meu_tipo = defmetatabela({}, { __tipo=funcao(este) retorne '<meu tipo>'; fim }) imprima('tipo:', tipo(meu_tipo));//----> <meu tipo>
1 2 3 4
local a,err = es.abra('file.txt', 'leitura'); imprima(tipo(a)); //----> arquivo local meu_tipo = defmetatabela({}, { __tipo=funcao(este) retorne '<meu tipo>'; fim }) imprima('tipo:', tipo(meu_tipo));//----> <meu tipo>
local op = leia(); local for = escolha(op); se for's' entao //único parâmetro é uma string, os parênteses são opcionais.. imprima('saindo ...'); sis.saia(0); senaose for'n' entao imprima('Usuário decidiu não sair ..\n'); senao imprima('opção inválida ..\n'); fim
1 2 3 4 5 6 7 8 9 10
local op = leia(); local for = escolha(op); se for's' entao //único parâmetro é uma string, os parênteses são opcionais.. imprima('saindo ...'); sis.saia(0); senaose for'n' entao imprima('Usuário decidiu não sair ..\n'); senao imprima('opção inválida ..\n'); fim
Essa função é boa para situações em que temos que comparar um mesmo item várias vezes com menos repetição, veja o mesmo código abaixo sem usar a funcao escolha()
local op = leia(); se op == 's' entao imprima('saindo ...'); sis.saia(0); senaose op == 'n' entao imprima('Usuário decidiu não sair ..\n'); senao imprima('opção inválida ..\n'); fim
1 2 3 4 5 6 7 8 9
local op = leia(); se op == 's' entao imprima('saindo ...'); sis.saia(0); senaose op == 'n' entao imprima('Usuário decidiu não sair ..\n'); senao imprima('opção inválida ..\n'); fim
se for(1,2,3,4,5) entao //mesmo que: se op==1 ou op==2 ou op==3 ou op==4 ou op==5 entao ... fim
Nomes - operadores - exemplos
bor: | i = 3 | 5;
band: & a = 3 & 5;
bxor: ~ b = 3 ~ 5;
lshift: << c = 7 << 1;
rshift: >> n = 7 >> 1;
un. not: ~ n = ~7;
__bor, __band, __bxor, __bshl, __bshr, __bnot
nome - operador - exemplo
idiv /. imprima( 5 /. 2) //--> 2
metamétodo: __idiv
local circ = {}; local mt = {}; mt.__tipo = funcao() retorne 'circulo'; fim defmetatabela( circ, mt); imprima(tipo(circ) ); //--> circulo
1 2 3 4 5 6
local circ = {}; local mt = {}; mt.__tipo = funcao() retorne 'circulo'; fim defmetatabela( circ, mt); imprima(tipo(circ) ); //--> circulo
Uso: exp ? opcao1 ou opcao2
x = (n > 10) ? 1 ou n;
Obs.: Na verdade é um açúcar sintático para: x = (n > 10) e 1 ou n;
local função máximo(...) local tn = {...}; local atual=tn[1]; para i=1, #tn início atual = (tn[i]>atual) ? tn[i] ou atual; fim retorne atual; fim imprima( máximo(1,2,3,4,8,0,2,1,12,3,4,10,2,1,0) );//--> 12
1 2 3 4 5 6 7 8 9
local função máximo(...) local tn = {...}; local atual=tn[1]; para i=1, #tn início atual = (tn[i]>atual) ? tn[i] ou atual; fim retorne atual; fim imprima( máximo(1,2,3,4,8,0,2,1,12,3,4,10,2,1,0) );//--> 12
funcao ou função são válidos, mas 'funçao' não é.
entao ou então, senao ou senão, senaose ou senãose, ate ou até, nao ou não, inicio ou início etc.
Obs.: As variáveis da biblioteca padrão em Prisma continuam sem acento:
Exemplo: poe (e não põe) - mas é facilmente possível adicionar acentos: local põe = poe; por isso, decidi não mudar essa parte.
Obs.: Os retornos de tipos também continuam sem acentos: tipo(1); retorna numero e não número.
Obs.: A tabela corotina foi mudada para corrotina; em caso de necessidade atribua: corotina = corrotina;
local cont = contador(); imprima(cont() ); //-->1 imprima(cont() ); //-->2 imprima(cont() ); //-->3 e assim por diante.
1 2 3 4
local cont = contador(); imprima(cont() ); //-->1 imprima(cont() ); //-->2 imprima(cont() ); //-->3 e assim por diante.
local cont = contador(0, 2); imprima( cont() ); //-->0 imprima( cont() ); //-->2 imprima( cont() ); //-->4 e assim por diante;
1 2 3 4
local cont = contador(0, 2); imprima( cont() ); //-->0 imprima( cont() ); //-->2 imprima( cont() ); //-->4 e assim por diante;
local cont = contador(10,-1); imprima( cont() ); //--> 10 imprima( cont() ); //--> 9 imprima( cont() ); //--> 8 e assim por diante.
1 2 3 4
local cont = contador(10,-1); imprima( cont() ); //--> 10 imprima( cont() ); //--> 9 imprima( cont() ); //--> 8 e assim por diante.
Obs.: observe que para o decremento apenas usamos um número negativo!
Agora ela pode também retornar o tamanho de um valor número C em bytes, bastando usar o caractere de escape % mais o caractere correspondente ao tipo numérico da linguagem C (dependente de plataforma):
local n = sis.tamanho('%i'); //sizeof(int); imprima(n);//--> 4 imprima( sis.tamanho('%d'); //sizeof(int); --> 4 (%d ou %i são o mesmo valor); imprima( sis.tamanho('%f'); //sizeof(float); --> 4 imprima( sis.tamanho('%lf'); //sizeof(double); --> 8 imprima( sis.tamanho('%Lf'); //sizeof(long double); --> 16 imprima( sis.tamanho('%lli'); //sizeof(long long int); --> 8 imprima( sis.tamanho('%llu'); //sizeof(unsigned long long); --> 8 imprima( sis.tamanho('%hi'); //sizeof(short int); --> 2 imprima( sis.tamanho('%hu'); //sizeof(unsigned short); --> 2 imprima( sis.tamanho('%p'); //sizeof(void *); --> 8 imprima( sis.tamanho('%c'); //sizeof(char); --> 1
1 2 3 4 5 6 7 8 9 10 11 12 13
local n = sis.tamanho('%i'); //sizeof(int); imprima(n);//--> 4 imprima( sis.tamanho('%d'); //sizeof(int); --> 4 (%d ou %i são o mesmo valor); imprima( sis.tamanho('%f'); //sizeof(float); --> 4 imprima( sis.tamanho('%lf'); //sizeof(double); --> 8 imprima( sis.tamanho('%Lf'); //sizeof(long double); --> 16 imprima( sis.tamanho('%lli'); //sizeof(long long int); --> 8 imprima( sis.tamanho('%llu'); //sizeof(unsigned long long); --> 8 imprima( sis.tamanho('%hi'); //sizeof(short int); --> 2 imprima( sis.tamanho('%hu'); //sizeof(unsigned short); --> 2 imprima( sis.tamanho('%p'); //sizeof(void *); --> 8 imprima( sis.tamanho('%c'); //sizeof(char); --> 1
imprima( sis.tamanho('%le')) //--> verdadeiro se o sistema for little-endian do contrário falso. imprima( sis.tamanho('%be')) //--> verdadeiro se o sistema for big-endian do contrário falso.
1 2
imprima( sis.tamanho('%le')) //--> verdadeiro se o sistema for little-endian do contrário falso. imprima( sis.tamanho('%be')) //--> verdadeiro se o sistema for big-endian do contrário falso.
Obs.: geralmente o sistema é 'le' little-endian. Isso tem a ver com a ordem dos bytes que formam um número, pesquise por endianess in C
* ALTERAÇÕES:
*
* ANTES ------------> DEPOIS
*
* mat.randonico() mat.aleatorio()
* mat.xrandonico() mat.xaleatorio()
* mat.arredonde() mat.arredondeacima() //arredonda um número para cima. Ex.: 4.2 -> 5
* mat.corte() mat.arredondeabaixo() //arredonda um número para baixo. Ex: 5.9 -> 5
*
*
* INCLUSÕES:
*
* mat.arredonde(n) ----> arredonda um número para o valor inteiro mais próximo.
* Ex.: 5.9 --> 6; 5.2 --> 5
* mat.raizcubica(n) ---> retorna a raiz cúbica de n imprima(mat.raizcubica(1000) ); //-->10
local n; poe'---------------------------------------'; poe'Observe o primeiro aleatório, é igual sempre'; para i = 1, 9 inicio n = N(mat.aleatorio(1,10) ); //aleatorio entre um e dez. imprima(n); fim poe'---------------------------------------'; poe( 'Observe que segundo aleatorio é diferente a cada execução,', '\npois usamos xaleatorio:' ) //usando xaleatorio() para criar uma semente. mat.xaleatorio(sis.tempo());//criando uma semente aleatória baseada no sis.tempo(); para i = 1, 9 inicio n = N(mat.aleatorio(1,10) ); //aleatorio entre um e dez. imprima(n); fim poe'\n---------------------------------------'; poe'---------------- mat.arredonde() -----------------'; imprima('3.8:', mat.arredonde(3.8) ) imprima('3.4', mat.arredonde(3.4) ); //a partir de 0.5 o número é arredondado para cima. poe'\n---------------------------------------'; poe'---------------- mat.arredondeacima() -----------------'; imprima('3.1:', mat.arredondeacima(3.1) ) poe'\n---------------------------------------'; poe'---------------- mat.arredondeabaixo() -----------------'; imprima('3.8:', mat.arredondeabaixo(3.8) ) poe'\n---------------------------------------'; poe'---------------- mat.raizcubica(n) -----------------'; imprima('mat.raizcubica(27):', mat.raizcubica(27) )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
local n; poe'---------------------------------------'; poe'Observe o primeiro aleatório, é igual sempre'; para i = 1, 9 inicio n = N(mat.aleatorio(1,10) ); //aleatorio entre um e dez. imprima(n); fim poe'---------------------------------------'; poe( 'Observe que segundo aleatorio é diferente a cada execução,', '\npois usamos xaleatorio:' ) //usando xaleatorio() para criar uma semente. mat.xaleatorio(sis.tempo());//criando uma semente aleatória baseada no sis.tempo(); para i = 1, 9 inicio n = N(mat.aleatorio(1,10) ); //aleatorio entre um e dez. imprima(n); fim poe'\n---------------------------------------'; poe'---------------- mat.arredonde() -----------------'; imprima('3.8:', mat.arredonde(3.8) ) imprima('3.4', mat.arredonde(3.4) ); //a partir de 0.5 o número é arredondado para cima. poe'\n---------------------------------------'; poe'---------------- mat.arredondeacima() -----------------'; imprima('3.1:', mat.arredondeacima(3.1) ) poe'\n---------------------------------------'; poe'---------------- mat.arredondeabaixo() -----------------'; imprima('3.8:', mat.arredondeabaixo(3.8) ) poe'\n---------------------------------------'; poe'---------------- mat.raizcubica(n) -----------------'; imprima('mat.raizcubica(27):', mat.raizcubica(27) )