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 textoO 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:
- Fica difícil saber qual é o valor atual
 - Diferentes partes do programa podem interferir umas com as outras
 - 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 + 1Aqui, 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 bananaNa 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?
- Previsibilidade: Se um valor nunca muda, você sempre sabe o que esperar dele
 - Clareza: É mais fácil entender o código quando valores não mudam inesperadamente
 - Segurança: Diferentes partes do programa não podem interferir uma com a outra acidentalmente