"A borboleta bateu as asas no passado. O furacão começou no presente."
# 1. Transpilar
python butterfly_compiler.py hello_world.bfy
# 2. Executar
python hello_world.py- Visão Geral
- Conceito e Filosofia
- Arquivos e Toolchain
- Estrutura Obrigatória do Programa
- Variáveis
- Tipos Suportados
- Comandos — Referência Completa
- Operadores de Comparação (WHEN)
- Mecânicas Temporais
- Tabela Rápida de Comandos
- Programas de Exemplo
- Passo a Passo — Executando os Programas
Butterfly.f é uma linguagem de programação esotérica de propósito geral que modela a execução de um programa como uma viagem no tempo: o código é dividido em passado e presente, e qualquer mudança feita no passado contamina caoticamente as leituras realizadas no presente.
| Atributo | Valor |
|---|---|
| Paradigma | Imperativo / Esotérico |
| Extensão de arquivo | .bfy |
| Traduz para | Python (código gerado executável direto com python) |
| Compilador | butterfly_compiler.py — Python puro, sem dependências |
| Versão | v2 — Extended |
Butterfly.f é baseada na Teoria do Caos e no clássico Efeito Borboleta:
Uma pequena mudança nas condições iniciais produz diferenças enormes no futuro.
Lei do Tempo: todo programa tem exatamente dois momentos — o PAST (passado) e o PRESENT (presente). O passado define as condições iniciais. O presente colhe as consequências — mas distorcidas pelo caos.
Lei do Destino: o programa deve alterar o estado do universo. Se nada mudar, o destino não foi alterado e a execução falha. Se mudar demais, cria-se um paradoxo e o universo colapsa.
Toda variável escrita no PAST contamina as leituras do PRESENT via XOR:
chaos_mask = var1_past ^ var2_past ^ var3_past ^ ...
No PRESENT: ler X → lê (X ^ chaos_mask)
O que você vê no presente pode não ser a realidade.
projeto/
├── butterfly_compiler.py ← compilador (Python puro)
├── hello_world.bfy ← código-fonte Butterfly.f
└── hello_world.py ← gerado pelo compilador (executável direto)
arquivo.bfy
│
│ python butterfly_compiler.py arquivo.bfy
▼
arquivo.py (Python gerado automaticamente)
│
│ python arquivo.py
▼
saída no terminal
| Ferramenta | Versão mínima | Instalação |
|---|---|---|
| Python | 3.7+ | python.org ou gerenciador de pacotes |
Nenhuma biblioteca externa necessária. O compilador usa apenas a biblioteca padrão do Python.
Todo arquivo .bfy obrigatoriamente contém dois blocos, sempre nesta ordem:
PAST_BEGIN
# código do passado
PAST_END
PRESENT_BEGIN
# código do presente
PRESENT_END
| Regra | Descrição |
|---|---|
| Dois blocos obrigatórios | Faltando um → erro de compilação |
| Ordem fixa | PAST sempre antes de PRESENT |
| Blocos podem estar vazios | Mas a Validação Temporal pode rejeitar |
| Comentários | Linhas que começam com # são ignoradas |
| Sensível a maiúsculas | PAST_BEGIN ≠ past_begin |
- Todas as variáveis são inteiras (inteiros Python — sem limite de tamanho)
- Todas têm escopo global (visíveis em ambos os blocos)
- Todas são inicializadas com
0automaticamente - Não é necessário declarar: basta usar
JESSIEé uma variável de sistema reservada com comportamento especial
Butterfly.f possui um único tipo de dado:
| Tipo | Descrição | Intervalo | Padrão |
|---|---|---|---|
| Inteiro | Números inteiros | ilimitado (Python int) | 0 |
Strings existem apenas como literais de saída nos comandos
ECHOeECHO_VAR. Não são armazenadas em variáveis.
SET <variável> <valor>
Atribui um valor inteiro literal a uma variável.
SET pontos 100
SET vida -5
SET x 0
PRINT <variável>
Adiciona o valor inteiro da variável ao buffer de saída.
⚠️ Efeito Borboleta ativo no PRESENT: em vez dex, imprimex ^ chaos_mask.
PRINT pontos # no PAST → valor real
PRINT pontos # no PRESENT → pontos XOR chaos_mask
LOTTERY_WIN <variável> <valor>
Intenção: somar valor à variável.
Realidade: o universo é cruel — soma apenas valor % 5, ou 2 se esse
resultado for zero.
LOTTERY_WIN moedas 50 # 50 % 5 = 0 → soma 2 (queria 50!)
LOTTERY_WIN sorte 7 # 7 % 5 = 2 → soma 2
LOTTERY_WIN vida 8 # 8 % 5 = 3 → soma 3
LOTTERY_WIN xp 99 # 99 % 5 = 4 → soma 4
| Valor desejado | valor % 5 |
Ganho real |
|---|---|---|
| 5, 10, 20, 50 | 0 | +2 |
| 6, 11, 16 | 1 | +1 |
| 7, 12, 17 | 2 | +2 |
| 8, 13, 18 | 3 | +3 |
| 9, 14, 19 | 4 | +4 |
PARADOX <variável>
Operação destrutiva em três estágios — não há retorno:
- Inverte todos os bits da variável:
var = ~var - Envia
SIGKILLao processo pai:kill(getppid(), SIGKILL) - Encerra o processo com código
42:exit(42)
Todo código após PARADOX é inacessível.
SET perigo 999
PARADOX perigo # ~999 = -1000, mata o pai, exit(42)
# código abaixo nunca executa
JESSIE = <valor>
Atribui valor à variável especial JESSIE e ativa a flag jessie_altered.
Consequência irreversível: ao final do programa, o buffer de saída inteiro é descartado e substituído pela mensagem:
Tudo foi em vao.
Isso afeta todo o output acumulado até então, inclusive prints do PAST.
ECHO "Esta mensagem será apagada"
JESSIE = 1 # ativa o override
ECHO "Esta também" # também apagada
# saída real → "Tudo foi em vao."
ECHO "<string>"
Adiciona uma string literal ao buffer de saída, seguida de nova linha.
Nunca é perturbado pelo Efeito Borboleta — strings literais são imunes ao caos.
Sequências de escape suportadas:
| Escape | Resultado |
|---|---|
\n |
Nova linha |
\t |
Tabulação |
\" |
Aspas duplas |
\\ |
Barra invertida |
ECHO "Hello, World!"
ECHO "Linha 1\nLinha 2"
ECHO "" # linha em branco
ECHO "Diz: \"oi\"" # Diz: "oi"
ECHO_VAR "<prefixo>" <variável> "<sufixo>"
Adiciona ao buffer: prefixo + valor da variável + sufixo + nova linha.
⚠️ Efeito Borboleta no PRESENT: exibevariável ^ chaos_mask. No PAST, exibe o valor real (poischaos_mask = 0durante o PAST).
ECHO_VAR "Pontos: " pontos " pts"
# saída → "Pontos: 42 pts"
ECHO_VAR "" contador ""
# saída → "7" (apenas o número)
GHOST <variável>
Decrementa a variável em 1. Equivale a var -= 1 em Python.
SET vida 3
GHOST vida # vida = 2
GHOST vida # vida = 1
GHOST vida # vida = 0
RISE <variável>
Incrementa a variável em 1. Equivale a var += 1 em Python.
SET pontos 0
RISE pontos # pontos = 1
RISE pontos # pontos = 2
TIMELINE <variável>
<corpo do loop>
COLLAPSE
Executa o corpo do loop enquanto variável > 0.
🔒 Proteção Temporal: A condição do loop sempre usa o valor real da variável — nunca a versão perturbada pelo chaos_mask. O caos não pode criar loops infinitos.
⚠️ O corpo deve conterGHOST <variável>(ou outra operação que a decremente) para evitar loop infinito.
SET contador 5
TIMELINE contador
ECHO_VAR "Iteração: " contador ""
GHOST contador
COLLAPSE
# imprime: 5, 4, 3, 2, 1
Gera em Python:
while contador > 0:
__bfy_echo_var("Iteração: ", contador, "")
contador -= 1WHEN <variável> ABOVE|BELOW|EQUALS <valor>
<corpo condicional>
ENDWHEN
Executa o corpo se a condição for verdadeira.
⚠️ Efeito Borboleta no PRESENT: a condição avaliavariável ^ chaos_mask. No PAST,chaos_mask = 0, então o valor real é usado — transparente.
WHEN pontos ABOVE 100
ECHO "Você venceu!"
ENDWHEN
WHEN vidas EQUALS 0
ECHO "Game over."
ENDWHEN
WHEN tempo BELOW 10
ECHO "Apresse-se!"
ENDWHEN
WHEN pode ser aninhado dentro de TIMELINE:
TIMELINE garrafas
WHEN garrafas ABOVE 1
ECHO_VAR "" garrafas " garrafas"
ENDWHEN
WHEN garrafas EQUALS 1
ECHO "1 garrafa"
ENDWHEN
GHOST garrafas
COLLAPSE
Usados exclusivamente como condição do comando WHEN:
| Palavra-chave | Operador Python | Significado |
|---|---|---|
ABOVE |
> |
Maior que |
BELOW |
< |
Menor que |
EQUALS |
== |
Igual a |
Estas mecânicas são injetadas automaticamente pelo compilador no Python gerado. O programador não precisa implementá-las — fazem parte do tecido da linguagem.
Todo output (PRINT, ECHO, ECHO_VAR) é acumulado em uma lista Python
em vez de ir direto para o terminal. Ao final do programa:
- Se
JESSIEnão foi alterada → buffer é exibido normalmente - Se
JESSIEfoi alterada → buffer é descartado; imprime"Tudo foi em vao."
Após a execução completa do bloco PAST, o compilador injeta:
chaos_mask = varA ^ varB ^ varC # XOR de TODAS as variáveis escritas no PASTA partir daí, toda leitura de variável no PRESENT vê o valor distorcido:
# No PRESENT:
PRINT x → __bfy_print(x ^ chaos_mask)
ECHO_VAR p x s → __bfy_echo_var(p, x ^ chaos_mask, s)
WHEN x ABOVE n → if (x ^ chaos_mask) > n:O que não é afetado pelo chaos_mask:
ECHO "string"→ strings literais são imunesSET,GHOST,RISE→ operações de escrita usam valores reais- Condição do
TIMELINE→ sempre usa valor real (para não criar loops infinitos)
Exemplo prático:
PAST: SET x 5, SET y 3
chaos_mask = 5 ^ 3 = 6
PRESENT:
PRINT x → imprime 5 ^ 6 = 3 (não é 5!)
PRINT y → imprime 3 ^ 6 = 5 (não é 3!)
# O caos inverteu a percepção de x e y
No início de main(), o compilador injeta:
__init_sum = var1 + var2 + ... + JESSIENo final de main(), antes do output:
__final_sum = var1 + var2 + ... + JESSIE
__delta = abs(__final_sum - __init_sum)| Condição do delta | Mensagem (stderr) | Código de saída |
|---|---|---|
delta == 0 |
ERRO: O destino nao foi alterado |
1 |
delta > 1000 |
ERRO: Paradoxo Temporal. O universo colapsou. |
2 |
1 ≤ delta ≤ 1000 |
(programa continua normalmente) | 0 |
Se JESSIE foi modificada em qualquer momento:
└── Descarta todo o buffer de saída
Imprime: "Tudo foi em vao."
Termina normalmente (exit 0)
A Validação Temporal ainda é executada antes do override do JESSIE. Um programa com delta inválido falha antes do JESSIE agir.
| Comando | Sintaxe | Descrição |
|---|---|---|
SET |
SET var valor |
Atribui constante inteira à variável |
PRINT |
PRINT var |
Imprime inteiro (XOR caos no PRESENT) |
LOTTERY_WIN |
LOTTERY_WIN var valor |
Soma valor%5 (ou 2 se zero) |
PARADOX |
PARADOX var |
~var + kill pai + exit(42) |
JESSIE = |
JESSIE = valor |
Override de toda a saída do programa |
ECHO |
ECHO "string" |
Imprime string literal (imune ao XOR) |
ECHO_VAR |
ECHO_VAR "pre" var "suf" |
Imprime "prefixo VALOR sufixo" |
GHOST |
GHOST var |
var-- (decrementa 1) |
RISE |
RISE var |
var++ (incrementa 1) |
TIMELINE |
TIMELINE var ... COLLAPSE |
while (var > 0) — loop temporal |
WHEN |
WHEN var OP n ... ENDWHEN |
if (var OP n) — condicional |
Operadores WHEN: ABOVE (>) · BELOW (<) · EQUALS (==)
Variável reservada: JESSIE
Comentários: # texto até o fim da linha
Objetivo: exibir uma mensagem simples de boas-vindas.
# hello_world.bfy — O primeiro fio do tempo em Butterfly.f
PAST_BEGIN
# A semente da mensagem é plantada no passado.
# Sem esta alteração o destino não mudaria (delta = 0 → erro).
SET eco 1
PAST_END
PRESENT_BEGIN
# Strings ECHO são imunes ao caos — saem sem distorção.
ECHO "Hello, World!"
ECHO "Butterfly.f diz ola ao universo."
ECHO ""
ECHO_VAR "Eco temporal registrado: " eco ""
PRESENT_END
Trace de execução:
| Etapa | Operação | Resultado |
|---|---|---|
| PAST | SET eco 1 |
eco = 1 |
| Butterfly | chaos_mask = eco = 1 |
chaos_mask = 1 |
| PRESENT | ECHO "Hello, World!" |
buffer ← "Hello, World!" |
| PRESENT | ECHO_VAR "..." eco "" |
exibe eco ^ 1 = 1 ^ 1 = 0 |
| Temporal | init=0, final=1, delta=1 | ✅ passa |
Saída:
Hello, World!
Butterfly.f diz ola ao universo.
Eco temporal registrado: 0
📌 O eco vale 1, mas o
chaos_mask = 1fazECHO_VARexibir1 ^ 1 = 0. O Efeito Borboleta apagou o próprio eco!
Objetivo: implementar a canção completa "99 bottles of beer".
# 99_garrafas.bfy — 99 Garrafas de Cerveja na Parede
PAST_BEGIN
SET garrafas 99
SET ressaca 0
TIMELINE garrafas
WHEN garrafas ABOVE 1
ECHO_VAR "" garrafas " garrafas de cerveja na parede,"
ECHO_VAR "" garrafas " garrafas de cerveja."
ENDWHEN
WHEN garrafas EQUALS 1
ECHO "1 garrafa de cerveja na parede,"
ECHO "1 garrafa de cerveja."
ENDWHEN
ECHO "Pegue uma e passe pra frente,"
GHOST garrafas
RISE ressaca
WHEN garrafas ABOVE 1
ECHO_VAR "" garrafas " garrafas de cerveja na parede!"
ENDWHEN
WHEN garrafas EQUALS 1
ECHO "1 garrafa de cerveja na parede!"
ENDWHEN
WHEN garrafas EQUALS 0
ECHO "Nenhuma garrafa de cerveja na parede!"
ENDWHEN
ECHO ""
COLLAPSE
PAST_END
PRESENT_BEGIN
ECHO "════════════════════════════════════════════"
ECHO " [ PRESENTE — Distorcido pelo Efeito Borboleta ]"
ECHO "════════════════════════════════════════════"
ECHO_VAR " Garrafas percebidas pelo caos : " garrafas ""
ECHO_VAR " Ressaca percebida pelo caos : " ressaca ""
ECHO "════════════════════════════════════════════"
ECHO " O passado bebeu tudo."
ECHO " O caos esconde a verdade."
ECHO " O universo equilibra os registros."
ECHO "════════════════════════════════════════════"
PRESENT_END
Trace de execução:
| Etapa | Valor |
|---|---|
| Início | garrafas=0, ressaca=0 |
| Após PAST (99 iterações) | garrafas=0, ressaca=99 |
chaos_mask = 0 ^ 99 |
chaos_mask = 99 |
ECHO_VAR garrafas (PRESENT) |
0 ^ 99 = 99 (parece cheio!) |
ECHO_VAR ressaca (PRESENT) |
99 ^ 99 = 0 (ressaca sumiu!) |
| init=0, final=99, delta=99 | ✅ passa |
Saída (início):
99 garrafas de cerveja na parede,
99 garrafas de cerveja.
Pegue uma e passe pra frente,
98 garrafas de cerveja na parede!
98 garrafas de cerveja na parede,
...
Saída (fim):
1 garrafa de cerveja na parede!
Nenhuma garrafa de cerveja na parede!
════════════════════════════════════════════
[ PRESENTE — Distorcido pelo Efeito Borboleta ]
════════════════════════════════════════════
Garrafas percebidas pelo caos : 99
Ressaca percebida pelo caos : 0
════════════════════════════════════════════
O passado bebeu tudo.
O caos esconde a verdade.
O universo equilibra os registros.
════════════════════════════════════════════
📌 O caos (
chaos_mask = 99) inverte completamente a percepção: 0 garrafas parecem 99, e 99 de ressaca parecem 0.
Objetivo: demonstrar TIMELINE, GHOST, RISE, ECHO_VAR e o Efeito Borboleta.
# contagem.bfy — Contagem Regressiva de Lançamento
PAST_BEGIN
SET inicio 10
SET lancamento 0
ECHO "╔══════════════════════════════════════════╗"
ECHO "║ CONTAGEM REGRESSIVA DE LANCAMENTO ║"
ECHO "║ [ Butterfly.f v2 ] ║"
ECHO "╚══════════════════════════════════════════╝"
ECHO ""
TIMELINE inicio
ECHO_VAR " T - " inicio " segundo(s)..."
GHOST inicio
COLLAPSE
ECHO ""
ECHO " >>> IGNIÇÃO! <<<"
ECHO " >>> DECOLAGEM CONFIRMADA! <<<"
ECHO ""
SET lancamento 1
PAST_END
PRESENT_BEGIN
ECHO "══════════════════════════════════════════"
ECHO " [ PRESENTE — Realidade Distorcida ]"
ECHO "══════════════════════════════════════════"
ECHO_VAR " Contador percebido pelo caos : " inicio ""
ECHO_VAR " Lancamento percebido pelo caos: " lancamento ""
ECHO ""
ECHO " O passado lancou o foguete."
ECHO " O caos esconde a verdade do presente."
ECHO "══════════════════════════════════════════"
PRESENT_END
Trace de execução:
| Etapa | Valor |
|---|---|
| Início | inicio=0, lancamento=0 |
| Após loop (10 iterações) | inicio=0 |
SET lancamento 1 |
lancamento=1 |
chaos_mask = inicio ^ lancamento |
0 ^ 1 = 1 |
ECHO_VAR inicio (PRESENT) |
0 ^ 1 = 1 (o caos nega o fim!) |
ECHO_VAR lancamento (PRESENT) |
1 ^ 1 = 0 (o caos nega o lançamento!) |
| init=0, final=1, delta=1 | ✅ passa |
Saída:
╔══════════════════════════════════════════╗
║ CONTAGEM REGRESSIVA DE LANCAMENTO ║
║ [ Butterfly.f v2 ] ║
╚══════════════════════════════════════════╝
T - 10 segundo(s)...
T - 9 segundo(s)...
T - 8 segundo(s)...
T - 7 segundo(s)...
T - 6 segundo(s)...
T - 5 segundo(s)...
T - 4 segundo(s)...
T - 3 segundo(s)...
T - 2 segundo(s)...
T - 1 segundo(s)...
>>> IGNIÇÃO! <<<
>>> DECOLAGEM CONFIRMADA! <<<
══════════════════════════════════════════
[ PRESENTE — Realidade Distorcida ]
══════════════════════════════════════════
Contador percebido pelo caos : 1
Lancamento percebido pelo caos: 0
O passado lancou o foguete.
O caos esconde a verdade do presente.
══════════════════════════════════════════
📌
chaos_mask = 1. O caos diz que o contador ainda está em 1 (nunca zerou) e que o lançamento nunca aconteceu (1 ^ 1 = 0). O passado lançou o foguete. O presente não consegue enxergar.
# Python 3.7 ou superior (Windows)
python --version
# Esperado: Python 3.7.x ou superiorColoque todos os arquivos no mesmo diretório:
meu_projeto/
├── butterfly_compiler.py ← compilador
├── hello_world.bfy
├── 99_garrafas.bfy
└── contagem.bfy
# Passo 1: transpilar .bfy → .py
python butterfly_compiler.py hello_world.bfy
# Passo 2: executar
python hello_world.pySaída esperada:
Hello, World!
Butterfly.f diz ola ao universo.
Eco temporal registrado: 0
python butterfly_compiler.py 99_garrafas.bfy
python 99_garrafas.pySaída esperada (início):
99 garrafas de cerveja na parede,
99 garrafas de cerveja.
Pegue uma e passe pra frente,
98 garrafas de cerveja na parede!
...
Saída esperada (fim):
...
Nenhuma garrafa de cerveja na parede!
════════════════════════════════════════════
[ PRESENTE — Distorcido pelo Efeito Borboleta ]
════════════════════════════════════════════
Garrafas percebidas pelo caos : 99
Ressaca percebida pelo caos : 0
════════════════════════════════════════════
O passado bebeu tudo.
O caos esconde a verdade.
O universo equilibra os registros.
════════════════════════════════════════════
python butterfly_compiler.py contagem.bfy
python contagem.pySaída esperada:
╔══════════════════════════════════════════╗
║ CONTAGEM REGRESSIVA DE LANCAMENTO ║
║ [ Butterfly.f v2 ] ║
╚══════════════════════════════════════════╝
T - 10 segundo(s)...
T - 9 segundo(s)...
...
T - 1 segundo(s)...
>>> IGNIÇÃO! <<<
>>> DECOLAGEM CONFIRMADA! <<<
══════════════════════════════════════════
[ PRESENTE — Realidade Distorcida ]
══════════════════════════════════════════
Contador percebido pelo caos : 1
Lancamento percebido pelo caos: 0
O passado lancou o foguete.
O caos esconde a verdade do presente.
══════════════════════════════════════════
foreach ($prog in @("hello_world", "99_garrafas", "contagem")) {
python butterfly_compiler.py "$prog.bfy"
python "$prog.py"
}| Mensagem (stderr) | Causa | Código de saída |
|---|---|---|
ERRO: O destino nao foi alterado |
Nenhuma variável foi modificada (delta = 0) | 1 |
ERRO: Paradoxo Temporal. O universo colapsou. |
Mudança excessiva nas variáveis (delta > 1000) | 2 |
Testando os erros:
# Erro 1: programa vazio — delta = 0
"PAST_BEGIN`nPAST_END`nPRESENT_BEGIN`nPRESENT_END" | Out-File vazio.bfy
python butterfly_compiler.py vazio.bfy
python vazio.py
# stderr: ERRO: O destino nao foi alterado
# Erro 2: paradoxo temporal — delta > 1000
"PAST_BEGIN`n SET a 501`n SET b 502`nPAST_END`nPRESENT_BEGIN`nPRESENT_END" | Out-File paradoxo.bfy
python butterfly_compiler.py paradoxo.bfy
python paradoxo.py
# stderr: ERRO: Paradoxo Temporal. O universo colapsou.Butterfly.f v2 — Python Edition "O passado sempre cobra seu preço." 🦋