Cópia estática
Copiado de docs/getting-started/first-program.md em https://github.com/poppy-team/aipo-lang (MIT). Fixado na revisão ce47c4e070404fc41722ccd8e2b7b808b99062a8, blob 0a5735ab34a0b886f5553c1a2d3fd66e4349e75a. O repositório de origem permanece canônico; esta cópia é atualizada por um pull request de sincronização, não em tempo real.
Neste tutorial rápido, vamos criar, verificar, compilar e executar o seu primeiro programa em Aipo.
Crie um arquivo chamado hello.aipo:
# hello.aipo
io.println("Olá do Aipo!")Execute diretamente pelo CLI:
aipo run hello.aipoSaída esperada:
Olá do Aipo!Vamos criar um programa que modela uma conta bancária com invariante de saldo positivo. Crie o arquivo conta.aipo:
# conta.aipo
struct Conta {
titular: String
numero: Int
var saldo: Float = 0.0
}
Conta:init(titular: String, numero: Int = 0, saldo: Float = 0.0) {
self.titular = titular
self.numero = numero
self.saldo = saldo
}
# Invariante: executada em todas as criações e mutações de campos
Conta:invariant {
self.saldo >= 0.0
}
Conta:depositar(var self, valor: Float) {
if valor <= 0.0 {
return fail("Valor de depósito deve ser positivo")
}
self.saldo += valor
}
Conta:sacar(var self, valor: Float) {
if valor <= 0.0 {
return fail("Valor de saque deve ser positivo")
}
# Tenta aplicar a operação. Se violar self.saldo >= 0.0,
# o bloco attempt reverte automaticamente a mutação!
attempt {
self.saldo -= valor
} failed erro {
return fail("Saque recusado: saldo insuficiente")
}
}
# Instanciando a conta usando dois-pontos (:) consistente
var c = Conta{ titular: "Maria Silva", numero: 1042, saldo: 150.0 }
io.println(f"Conta criada para: {c.titular}")
io.println(f"Saldo inicial: {c.saldo}")
c.depositar(50.0)
io.println(f"Saldo após depósito: {c.saldo}")
c.sacar(75.0)
io.println(f"Saldo após saque: {c.saldo}")Execute o programa:
aipo run conta.aipoSaída esperada:
Conta criada para: Maria Silva
Saldo inicial: 150.0
Saldo após depósito: 200.0
Saldo após saque: 125.0Uma das grandes forças do Aipo é a transparência do compilador. Você pode visualizar as instruções de bytecode geradas para qualquer arquivo:
aipo disasm conta.aipoO comando exibirá o desassembly com linhas e colunas mapeadas, demonstrando a alocação de registradores, frames de chamada e tabelas de constantes.
Você pode transpilar o mesmo código para JavaScript executável via Node.js:
aipo build conta.aipo -o dist/conta.js
node dist/conta.jsO código gerado possui paridade comportamental completa com a VM em Rust.