designliquido / delegua Goto Github PK
View Code? Open in Web Editor NEWLinguagem de programação 100% em português baseada em TypeScript, independente de sistema operacional e dispositivo, e suporte a múltiplos dialetos.
License: MIT License
Linguagem de programação 100% em português baseada em TypeScript, independente de sistema operacional e dispositivo, e suporte a múltiplos dialetos.
License: MIT License
Criar e melhorar testes existestes para:
Parte 2 das traduções.
Padrão é delegua
.
Instalei o lodash
global na máquina, e fiz o seguinte teste:
inicio.delegua
var lodash = importar('lodash');
var a = { 'b': 'c' };
escreva(lodash.get(a, 'b', 'f'));
delegua inicio.delegua
TypeError: Cannot read properties of null (reading 'constructor')
Erro em JavaScript: Cannot convert undefined or null to object
Pilha de execução: TypeError: Cannot convert undefined or null to object
Depende de #129.
funcao funcaoTestaMap(lista) {
retorna mapear(
lista,
funcao(valor) {
retorna valor
})
}
escreva(funcaoTestaMap([1, 2, 3, 4]))
retorno:
NaN, NaN, NaN, NaN
funcao funcaoTestaMap(lista) {
retorna mapear(
lista,
funcao(valor) {
retorna valor;
})
}
escreva(funcaoTestaMap([1, 2, 3, 4]))
retorno:
1, 2, 3, 4
Ao tentar clonar uma variável a partir de outra, essa nova variável está recebendo o objeto inteiro ("valor" e "tipo") ao invés de receber somente o valor.
Exemplo:
var a = 123;
var copia = a;
escreva(copia); // {"valor":{"valor":123,"tipo":"número"},"tipo":"dicionário"}
Estou ciente de que clonar dessa forma pode ser um pouco incomum, mas nunca podemos duvidar do comportamento do usuário.
Podemos notar também que outra consequência dessa Issue é que as variáveis clonadas sempre receberão o tipo 'dicionário' por receberem o objeto inteiro.
Em tempo, ressalto que quando clonamos uma variável com implementações extras (o que é mais comum), o funcionamento ocorre de acordo:
var a = 'Vitor Brandao';
var aMaiusculo = a.maiusculo();
escreva(aMaiusculo); // "VITOR BRANDAO"
Mas mesmo ao tentar clonar a variável bem sucedida, persiste a atribuição do objeto inteiro:
var a = 'Vitor Brandao';
var aMaiusculo = a.maiusculo();
var copia = aMaiusculo;
escreva(copia); // {"valor":{"valor":"VITOR BRANDAO","tipo":"texto"},"tipo":"dicionário"}
classe Animal {
correr() {
escreva("Correndo Loucamente"); aquiPrecisaGerarUmErro
}
}
classe Cachorro herda Animal {
latir() {
escreva("Au Au Au Au");
}
}
var nomeDoCachorro = Cachorro();
nomeDoCachorro.correr();
nomeDoCachorro.latir();
classe Resposta {
enviar(codigo) {
isto.codigo = codigo
}
status(statusHttp) {
isto.statusHttp = statusHttp
}
}
var resp = Resposta();
escreva(resp.enviar("Ok").status(200))
Neste caso:
enviar(codigo) {
isto.codigo = codigo
}
"Ok" é retornado pelo Interpretador, e
status(statusHttp) {
isto.statusHttp = statusHttp
}
200
é retornado pelo Interpretador.
Documentar métodos, classes, propriedades ...
TYPEDOC: Parece ser uma boa opção.
https://typedoc.org/guides/installation/
Essa funcionalidade é para o dialeto
Delégua.
Hoje, só é possível realizar operações matemáticas se fizer a atribuição a uma variável.
A idéia aqui é permitir essas operações no console sem precisar dessa atribuição e assim mostrar o resultado.
9-2
9*2
9/2
9**2
Também para operadores lógicos.
2 != 2; // falso
1==1; // verdadeiro
5+5; // 10
inicio.delegua
var funcoesMatematicas = importar('./funcoes.delegua')
var soma = funcoesMatematicas.soma(1, 2)
escreva(soma)
funcoes.delegua
função soma(valor1, valor2){
retorna valor1 + valor2;
}
delegua inicio.delegua
Erro: [Linha: 3] Chamada de função ou método inexistente: [object Object]
Testando:
classe Animal {
correr() {
escreva("Correndo Loucamente");
}
}
classe Cachorro herda Animal {
latir() {
escreva("Au Au Au Au"); aqui é pra gerar um erro
}
}
var nomeDoCachorro = Cachorro();
nomeDoCachorro.correr();
nomeDoCachorro.latir();
Deveria retornar erro, mas não retorna e funciona normal.
var x = 10;
var y = 10;
var z = 10;
escreva(x, y, z);
Deveria escrever: 10 10 10
Essa funcionalidade é para o dialeto
Delégua.
testes.delegua
função testeRetornoNulo(){
retorna nulo
}
inicio.delegua
var teste = importar('./testes.delegua')
var resultado = teste.testeRetornoNulo()
escreva(resultado)
delegua inicio.delegua
Retorno esperado
nulo
Retorno obtido
null
C:\delegua\fontes\interpretador\pilha-escopos-execucao.ts:34
this.pilha.at(-1).ambiente.valores[nomeVariavel] = valor;
^
TypeError: this.pilha.at is not a function
at PilhaEscoposExecucao.definirVariavel (C:\delegua\fontes\interpretador\pilha-escopos-execucao.ts:34:20)
at default_1 (C:\delegua\fontes\bibliotecas\biblioteca-global.ts:12:26)
at new Interpretador (C:\delegua\fontes\interpretador\interpretador.ts:89:33)
at new Delegua (C:\delegua\fontes\delegua.ts:85:38)
at principal (C:\delegua\index.ts:21:21)
at Object. (C:\delegua\index.ts:30:1)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Module._compile (C:\delegua\node_modules\ts-node\src\index.ts:1455:23)
at internal/modules/cjs/loader.js:1114:10
at Object..ts (C:\delegua\node_modules\ts-node\src\index.ts:1458:12)
Waiting for the debugger to disconnect...
var valor = inteiro(1)
se (valor > 0) {
escreva('Este número é positivo!');
} senao se (valor < 0) {
escreva('Este número é negativo!');
} senao {
escreva('Zero não é positivo nem negativo');
}
retorno:
Este número é positivo!
var valor = inteiro(-1)
se (valor > 0) {
escreva('Este número é positivo!');
} senao se (valor < 0) {
escreva('Este número é negativo!');
} senao {
escreva('Zero não é positivo nem negativo!');
}
retorno:
Este número é negativo!
var valor = inteiro(0)
se (valor > 0) {
escreva('Este número é positivo!');
} senao se (valor < 0) {
escreva('Este número é negativo!');
} senao {
escreva('Zero não é positivo nem negativo');
}
retorno:
Erro em JavaScript: Somente números podem passar para inteiro.
Pilha de execução: Error: Somente números podem passar para inteiro.
var valor = inteiro("1")
se (valor > 0) {
escreva('Este número é positivo!');
} senao se (valor < 0) {
escreva('Este número é negativo!');
} senao {
escreva('Zero não é positivo nem negativo');
}
retorno:
Este número é positivo!
var valor = inteiro("-1")
se (valor > 0) {
escreva('Este número é positivo!');
} senao se (valor < 0) {
escreva('Este número é negativo!');
} senao {
escreva('Zero não é positivo nem negativo!');
}
retorno:
Este número é negativo!
var valor = inteiro("0")
se (valor > 0) {
escreva('Este número é positivo!');
} senao se (valor < 0) {
escreva('Este número é negativo!');
} senao {
escreva('Zero não é positivo nem negativo');
}
retorno:
Zero não é positivo nem negativo!
Se escrevermos somente o nome da variável no terminal e dermos um enter, o código retorna um objeto com as chaves "valor" e "tipo". Exemplo:
var texto = "Olá, tudo bem?"; // undefined
texto // {"valor":"Olá, tudo bem?","tipo":"texto"}
Até aqui, tudo bem, pois quando digitamos o nome da variável, o objeto contendo valor e tipo são retornados na íntegra.
Porém, se seguirmos o mesmo processo, mas utilizamos o método escreva(variável) para ler, o código retorna o valor, mas seguido de um undefined na linha abaixo:
var texto = "Olá, tudo bem?";
escreva(texto);
// Olá, tudo bem?
// undefined
OBSERVAÇÕES FINAIS:
var x = 1 + 1;
escreva(x);
Esta retornando null, deveria retornar 2.
Começou a partir da versão 0.1.3
Cenário:
escreva('abc' + 123); // abc123
Se repetir o mesmo processo, não vai mostrar nada no console, mesmo se tentar escrever qualquer outra coisa.
O resultado é sempre o mesmo, funcionando apenas uma única vez.
Quando tento usar delegua em outros projetos, gera erro no perf_hooks
.
Comando leia
só funciona se passar texto ou texto vazio como leia('')
se não passar nada gera erro.
var a = leia()
Erro no '': Esperado expressão.
Idéia aqui seria retornar uma pilha de erros.
Hoje usamos console.log()
mas dependendo da aplicação, pode não ser a melhor solução.
escreva(nulo == nulo)
ou
nulo == nulo
Erro em JavaScript: Cannot read properties of null (reading 'hasOwnProperty')
Pilha de execução: TypeError: Cannot read properties of null (reading 'hasOwnProperty')
Se a string de this.codigo
não vinher com os \n
nos locais certos o lexador entra em uma verificação infinita.
Meu proximo passo e corrigir esse bug.
Hoje, só é possível fazer comentários com //
a idéia é também permitir o uso de /* */
para várias linhas.
Usar algo como:
/*
Comentário
Comentário
Comentário
Comentário
*/
A partir da versão 0.3.0 de Delégua, ao definir variável, esta gerando problema de variável não definida.
Cenário:
var a = 1
a
escreva(a)
Erro: [Linha: 1] Variável não definida 'a'.
O problema vem de Égua Clássico. escolha
não aceita bloco para cada caso, não aceita múltiplos casos pro mesmo bloco, e não reconhece a palavra sustar
(ou pausa
).
var lista = [1, 2, 3, 4, 5, 6, 7, 8, 9];
escreva(lista) // 1, 2, 3, 4, 5, 6, 7, 8, 9
Motivo:
É iniciado as intancias das classes via construtor, depois é sobrescrito por novas instancias.
escreva('teste', 1, 2, 3)
Resultado:
3
Dado o seguinte array de string:
['5*4', 'escreva(2 + 2)']
Saída:
4
Esperado:
20
4
Esse problema ocorre no seguinte método analisarNumero()
do arquivo lexador.ts
:
const numeroCompleto = this.codigo[this.linha].substring(
this.inicioSimbolo,
this.atual
);
this.adicionarSimbolo(
tiposDeSimbolos.NUMERO,
parseFloat(numeroCompleto)
);
A variável numeroCompleto
era pra retornar 4, mas esta retornando vazio, e quando tenta fazer o parseFloat gera NaN
;
Testando, verifiquei que this.atual
esta com valor errado.
Ex:
var a = 1 == 1
escreva(a) // true
var b = 1 !== 1
escreva(b) // false
PS C:\delegua> escreva(856+4)
Erro:
escreva : The term 'escreva' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included,
verify that the path is correct and try again.
At line:1 char:1
- escreva(856+4)
- CategoryInfo : ObjectNotFound: (escreva:String) [], CommandNotFoundException
- FullyQualifiedErrorId : CommandNotFoundException
Usando dialeto: padrão
[Arquivo: bhaskara.egua] [Linha: undefined] Erro no ';': Esperado '}' após o bloco.
Waiting for the debugger to disconnect...
No dialeto Égua funciona normal.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.