Problema da atribuição e como o cálculo lambda resolve isso


O que é atribuição?

Imagine que você tem uma caixa chamada x. Quando você faz uma atribuição, você está mudando o que tem dentro dessa caixa para algum outro valor:

# Em linguagens tradicionais:
x = 5        # A caixa x agora tem o número 5
x = x + 1    # A caixa x agora tem o número 6
x = "texto"  # A caixa x agora tem um texto

O problema com atribuições

Pense em uma receita de bolo. Se alguém ficar mudando os ingredientes enquanto você faz a receita, o resultado pode ser imprevisível. Com código é a mesma coisa.

Quando muitas partes do programa podem mudar o valor de uma mesma variável:

  1. Fica difícil saber qual é o valor atual
  2. Diferentes partes do programa podem interferir umas com as outras
  3. Bugs podem aparecer de formas inesperadas

Como o cálculo lambda resolve isso?

No cálculo lambda (e linguagens funcionais), em vez de mudar o valor de uma variável, criamos valores novos:

-- Em uma linguagem funcional:
let numero = 5
let numeroMaisUm = numero + 1

Aqui, numero sempre será 5, e criamos um novo valor numeroMaisUm que é 6. É como se, em vez de reutilizar a mesma caixa, usássemos caixas novas para cada valor diferente.

Exemplo

Imagine um programa que lida com uma lista de compras:

# Forma tradicional (com atribuição):
lista = ["maçã", "banana"]
lista.append("laranja")     # Mudamos a lista original
lista.remove("banana")      # Mudamos de novo
# Forma funcional (sem atribuição):
let lista1 = ["maçã", "banana"]
let lista2 = adicionar(lista1, "laranja")    # Nova lista com laranja
let lista3 = remover(lista2, "banana")       # Nova lista sem banana

Na forma funcional:

  • Cada lista é um novo valor
  • A lista original nunca muda
  • É mais fácil rastrear o que aconteceu
  • Não há risco de uma parte do programa modificar a lista sem outras partes saberem

Por que isso reduz bugs?

  1. Previsibilidade: Se um valor nunca muda, você sempre sabe o que esperar dele
  2. Clareza: É mais fácil entender o código quando valores não mudam inesperadamente
  3. Segurança: Diferentes partes do programa não podem interferir uma com a outra acidentalmente

Referências


Aula 1 - Cálculo Lambda