Repository: DesignLiquido/delegua
Pull request #147 (2022-10-30 14:05:48)

#140 Escreva retornando undefined
https://github.com/DesignLiquido/delegua/issues/140


Patch:
diff --git a/fontes/delegua.ts b/fontes/delegua.ts
index 8f8cb599..ef65bad3 100644
--- a/fontes/delegua.ts
+++ b/fontes/delegua.ts
@@ -132,9 +132,8 @@ export class Delegua implements DeleguaInterface {
 
         leiaLinha.prompt();
         leiaLinha.on('line', (linha: string) => {
-            const retornoInterpretacao = isto.executarUmaLinha(linha);
-            const resultado = retornoInterpretacao.resultado;
-            if (resultado !== undefined) {
+            const { resultado } = isto.executarUmaLinha(linha);
+            if (resultado.length) {
                 isto.funcaoDeRetorno(resultado[0]);
             }
             
diff --git a/fontes/interpretador/inferenciador.ts b/fontes/interpretador/inferenciador.ts
index 7355367e..e705db51 100644
--- a/fontes/interpretador/inferenciador.ts
+++ b/fontes/interpretador/inferenciador.ts
@@ -14,9 +14,10 @@ export function inferirTipoVariavel(
         case 'undefined':
             return 'nulo';
         case 'object':
-            // Variável pode ser vetor ou dicionário.
             if (Array.isArray(variavel))
                 return 'vetor';
+            if (variavel === null)
+                return 'nulo'
             return 'dicionário';
         case 'function':
             return 'função';
diff --git a/fontes/interpretador/interpretador.ts b/fontes/interpretador/interpretador.ts
index a054b864..ebacc229 100644
--- a/fontes/interpretador/interpretador.ts
+++ b/fontes/interpretador/interpretador.ts
@@ -207,6 +207,8 @@ export class Interpretador implements InterpretadorInterface {
         esquerda: VariavelInterface | any,
         direita: VariavelInterface | any
     ): boolean {
+        if (esquerda === null && direita === null) return true;
+        if (esquerda === null) return false;
         if (esquerda.tipo) {
             if (
                 esquerda.tipo === 'nulo' &&
@@ -218,8 +220,6 @@ export class Interpretador implements InterpretadorInterface {
 
             return esquerda.valor === direita.valor;
         }
-        if (esquerda === null && direita === null) return true;
-        if (esquerda === null) return false;
 
         return esquerda === direita;
     }
@@ -262,16 +262,16 @@ export class Interpretador implements InterpretadorInterface {
         const direita: VariavelInterface | any = this.avaliar(
             expressao.direita
         );
-        const valorEsquerdo: any = esquerda.hasOwnProperty('valor')
+        const valorEsquerdo: any = esquerda?.hasOwnProperty('valor')
             ? esquerda.valor
             : esquerda;
-        const valorDireito: any = direita.hasOwnProperty('valor')
+        const valorDireito: any = direita?.hasOwnProperty('valor')
             ? direita.valor
             : direita;
-        const tipoEsquerdo: string = esquerda.hasOwnProperty('tipo')
+        const tipoEsquerdo: string = esquerda?.hasOwnProperty('tipo')
             ? esquerda.tipo
             : inferirTipoVariavel(esquerda);
-        const tipoDireito: string = direita.hasOwnProperty('tipo')
+        const tipoDireito: string = direita?.hasOwnProperty('tipo')
             ? direita.tipo
             : inferirTipoVariavel(direita);
 


Test patch:
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index 991be412..e3295637 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -46,7 +46,7 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
-                it('Template Literals', () => {
+                it('Interpolação de Texto', () => {
                     const retornoLexador = delegua.lexador.mapear([
                         "var comidaFavorita = 'strogonoff'",
                         'escreva("Minha comida favorita é ${comidaFavorita}")'
@@ -104,8 +104,8 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
-                it('verdadeiro', () => {
-                    const retornoLexador = delegua.lexador.mapear(["escreva(verdadeiro)"], -1);
+                it('nulo igual a nulo', () => {
+                    const retornoLexador = delegua.lexador.mapear(["escreva(nulo == nulo)"], -1);
                     const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
                     
                     const retornoInterpretador = delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
@@ -113,8 +113,8 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
-                it('falso', () => {
-                    const retornoLexador = delegua.lexador.mapear(["escreva(falso)"], -1);
+                it('verdadeiro', () => {
+                    const retornoLexador = delegua.lexador.mapear(["escreva(verdadeiro)"], -1);
                     const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
                     
                     const retornoInterpretador = delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
@@ -122,12 +122,8 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
-                it('interpolação de texto', () => {
-                    const codigo = [
-                        'var minha_variavel = "Strogonoff"',
-                        'escreva("Eu gosto de ${minha_variavel}")'
-                    ]
-                    const retornoLexador = delegua.lexador.mapear(codigo, -1);
+                it('falso', () => {
+                    const retornoLexador = delegua.lexador.mapear(["escreva(falso)"], -1);
                     const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
                     
                     const retornoInterpretador = delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
@@ -201,7 +197,7 @@ describe('Interpretador', () => {
                         afterAll(() => {
                             jest.unmock("./__mocks__/matematica.ts")
                         })
-                        it('matemática' , () => {
+                        it('matemática com acento' , () => {
                             const retornoLexador = delegua.lexador.mapear(["var matemática = importar('matemática')"], -1);
                             const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
                             const retornoInterpretador = delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
@@ -209,7 +205,7 @@ describe('Interpretador', () => {
                             expect(retornoInterpretador.erros).toHaveLength(0);
                         });
 
-                        it('matematica' , () => {
+                        it('matematica sem acento' , () => {
                             const retornoLexador = delegua.lexador.mapear(["var matematica = importar('matematica')"], -1);
                             const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
                             const retornoInterpretador = delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);