03 — Noções Básicas
Meta do capítulo: aprender como bindings, funções e o ponto de entrada se encaixam. Referência:
../language-reference/statements.md,../language-reference/functions.md.
let, let mut, const
Aura torna a mutabilidade explícita na declaração.
let name = "Alice" // immutable binding
let mut counter = 0 // mutable binding
const LIMIT = 3 // constant; must be initialised
counter += 1 // ok — counter is mutable
Regras:
letliga um nome que não pode ser reatribuído.let mutliga um nome que pode ser reatribuído.constdeve ser inicializado e nunca é reatribuível.- Reatribuir um
letouconsté E303, e é um erro (não um warning) tanto emaura run, quanto emaura checke no REPL.
let x = 1
x = 2 // E303: reassign an immutable binding
let mut total = 0
total += 1 // ok
Uma anotação é opcional e vem após ::
let age: int = 30
let items: [int] = [1, 2, 3]
const MAX: int = 100
Não há var. var x = 1 é rejeitado com uma mensagem apontando para let mut/let.
Desestruturação
let (a, b) = (1, 2)
let [first, ...rest] = [1, 2, 3, 4]
print(a, b, first, rest) // 1 2 1 [2, 3, 4]
O elemento ...name coleta os itens restantes.
def — funções
Funções são declaradas com def. Não há fn, fun nem function.
def greet(name) -> str {
return "Hello, " + name
}
def square(x: int) -> int = x * x // expression body
O corpo é ou um bloco com chaves ou um único = expr. Um tipo de retorno após -> é opcional; parâmetros podem ser anotados, não anotados, com default ou variádicos. Tudo isso é o capítulo 06.
main — o ponto de entrada
Um arquivo rodado com aura run deve ter um main de nível superior. O runtime o chama; nunca o chame você mesmo.
def main() {
print("entry point")
}
main pode:
- não receber parâmetros, ou receber um único parâmetro
args; - ser
async; - retornar um
int, que vira o código de saída do processo.
def main() -> int {
return 3 // process exit code 3
}
Um main ausente é E310; uma assinatura errada é E311; um main dentro de um corpo de module é E312.
print
print escreve seus argumentos na saída padrão, separados por espaço, com uma quebra de linha final:
def main() {
print("value:", 42, true)
}
value: 42 True
Literais booleanos são true e false; o valor nulo é none. Note como true imprime como o True do Python: booleanos são booleanos do CPython em runtime.
Juntando tudo
const GREETING = "Hello"
def greet(name, punctuation = "!") -> str {
return GREETING + ", " + name + punctuation
}
def main() {
let mut count = 0
print(greet("world"))
count += 1
print(f"greeted {count} time(s)")
}
Hello, world!
greeted 1 time(s)
Posição dos modificadores
Modificadores de classe e de módulo aparecem antes da keyword de declaração: private let x = 1, nunca let private x. Isso importa a partir do capítulo 07.
O que você aprendeu
leté imutável,let muté mutável,consté constante.- Reatribuir um binding imutável é E303.
defdeclara funções; o corpo é um bloco ou= expr.mainé o ponto de entrada e é invocado pelo runtime.print,true/false,nonee f-strings.