diff --git a/LICENSE b/LICENSE index b836d8cb..085061db 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022-2023 Design Líquido +Copyright (c) 2022-2024 Design Líquido Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/LICENSE.pt.txt b/LICENSE.pt.txt index 91368f55..5afa271a 100644 --- a/LICENSE.pt.txt +++ b/LICENSE.pt.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022-2023 Design Líquido +Copyright (c) 2022-2024 Design Líquido Permissão concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o "Software"), para lidar diff --git a/fontes/interpretador/interpretador-com-depuracao.ts b/fontes/interpretador/interpretador-com-depuracao.ts index 71dc1030..c6497bde 100644 --- a/fontes/interpretador/interpretador-com-depuracao.ts +++ b/fontes/interpretador/interpretador-com-depuracao.ts @@ -1,3 +1,5 @@ +import _ from "lodash"; + import { EspacoVariaveis } from '../espaco-variaveis'; import { Bloco, Declaracao, Enquanto, Escreva, Leia, LeiaMultiplo, Para, Retorna, Var } from '../declaracoes'; import { PontoParada } from '../depuracao'; @@ -202,24 +204,30 @@ export class InterpretadorComDepuracao extends InterpretadorBase implements Inte } async visitarDeclaracaoPara(declaracao: Para): Promise { - const corpoExecucao = declaracao.corpo as Bloco; - const declaracaoInicializador = Array.isArray(declaracao.inicializador) + // Aqui precisamos clonar a declaração porque modificamos + // algumas propriedades que indicam o estado da execução dela. + // Por exemplo, se chamamos uma função que tem dentro dela um bloco Para, + // cada execução do bloco precisa de uma inicialização diferente. + const cloneDeclaracao = _.cloneDeep(declaracao) as Para; + const corpoExecucao = cloneDeclaracao.corpo as Bloco; + + const declaracaoInicializador = Array.isArray(cloneDeclaracao.inicializador) ? declaracao.inicializador[0] : declaracao.inicializador; - if (declaracaoInicializador !== null && !declaracao.inicializada) { + if (declaracaoInicializador !== null) { await this.avaliar(declaracaoInicializador); // O incremento vai ao final do bloco de escopo. - if (declaracao.incrementar !== null) { - corpoExecucao.declaracoes.push(declaracao.incrementar); + if (cloneDeclaracao.incrementar !== null) { + corpoExecucao.declaracoes.push(cloneDeclaracao.incrementar); } } - declaracao.inicializada = true; + cloneDeclaracao.inicializada = true; const escopoAtual = this.pilhaEscoposExecucao.topoDaPilha(); switch (this.comando) { case 'proximo': - if (declaracao.condicao !== null && this.eVerdadeiro(await this.avaliar(declaracao.condicao))) { + if (cloneDeclaracao.condicao !== null && this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) { escopoAtual.emLacoRepeticao = true; const resultadoBloco = this.executarBloco(corpoExecucao.declaracoes); @@ -231,7 +239,7 @@ export class InterpretadorComDepuracao extends InterpretadorBase implements Inte default: let retornoExecucao: any; while (!(retornoExecucao instanceof Quebra) && !this.pontoDeParadaAtivo) { - if (declaracao.condicao !== null && !this.eVerdadeiro(await this.avaliar(declaracao.condicao))) { + if (cloneDeclaracao.condicao !== null && !this.eVerdadeiro(await this.avaliar(cloneDeclaracao.condicao))) { break; } diff --git a/package.json b/package.json index 1ca1b7e7..51c81efd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@designliquido/delegua", "version": "0.33.16", - "description": "Linguagem de programação simples e moderna usando português estruturado, com suporte a múltiplos dialetos", + "description": "Linguagem de programação simples e moderna usando português estruturado.", "main": "index.js", "types": "index.d.ts", "scripts": {