Skip to content

Conversation

@Aristidescosta
Copy link
Contributor

Implementa sistema de escopo LEGB para Pituguês

Problema

O Pituguês não diferenciava escopo local de global corretamente. Quando uma atribuição era feita dentro de uma função, o interpretador modificava a variável global em vez de criar uma variável local, causando efeitos colaterais indesejados.

Closes #1018

Comportamento anterior (incorreto):

x = 10

funcao teste():
    x = 5      # Modificava a global ❌
    escreva(x)

teste()
escreva(x)     # Resultado: 5, 5
Solução
Implementa o sistema de escopo LEGB (Local, Enclosing, Global, Built-in) similar ao Python. Agora, toda atribuição dentro de uma função cria uma variável local, a menos que a variável  exista no escopo atual.

x = 10

funcao teste():
    x = 5      # Cria nova variável local ✓
    escreva(x)

teste()
escreva(x)     # Resultado: 5, 10

## 🎯 Resolve

@Aristidescosta
Copy link
Contributor Author

@leonelsanchesdasilva

Bom, tive que reverter a solução para suportar o LEGB porque qualquer override de visitarExpressaoDeAtribuicao causa travamento porque

Esse método é chamado em loops/recursões internas
Modificá-lo quebra invariantes do sistema

Acredito que para implementar LEGB seria necessário refatorar
PilhaEscoposExecucao.atribuirVariavel() para aceitar flag de "apenas escopo atual" ou criar PilhaEscoposExecucaoPitugues com comportamento diferente ou se calhar modificar o interpretador-base para suportar diferentes estratégias de escopo.

O problema é que esta seria uma mudança arquitetural significativa que está fora do escopo desta PR.

Como devo proceder?

@leonelsanchesdasilva
Copy link
Contributor

Obrigado pela PR, @Aristidescosta.

A ideia sobre a PilhaEscoposExecucaoPitugues é o caminho a ser seguido aqui. Nela poderás implementar as variações de comportamento de escopo necessárias para resolver #1018.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Pituguês] Escopo de Variáveis e Shadowing

2 participants