func soma(a: Int, b: Int) -> Int {
return a + b
}
- Tipos de parâmetros opcionais (ausentes => não checados por agora).
returnopcional; ausência implicanone.
Cada função captura o ambiente no momento da definição (Rc<RefCell>). Ao chamar, novo ambiente filho é criado apontando para a closure.
Argumentos são avaliados antes da troca de ambiente (corrige bug onde variáveis externas sumiam).
let x = 5
func inc(n) { return n + x }
println(inc(10)) // 15
Quando uma função interna e retornada como callback, o runtime preserva o ambiente capturado para evitar ambiente "dangling" no momento da chamada futura.
func make_adder(base) {
func add(v) { return v + base }
return add
}
let plus_two = make_adder(2)
println(plus_two(41)) // 43
Funções podem ser passadas como parâmetros e reutilizadas em fluxos declarativos.
func apply_twice(cb, value) {
return cb(cb(value))
}
let delta = 3
func add_delta(n) { return n + delta }
println(apply_twice(add_delta, 10)) // 16
arr.sum() é parseado como Call(FieldAccess(arr, sum), []). Se o resultado de FieldAccess não for chamável e não houver argumentos, o interpretador retorna o valor direto (permitindo pseudo-métodos sem implementar sistema de métodos ainda).
Sintaxe atual direta (até introdução de blocos impl futura):
struct Pessoa { nome: String, }
func Pessoa.greet(self) { println(f"Olá, {self.nome}!"); }
let p = Pessoa { nome: "Ada" };
p.greet(); // `self` é injetado automaticamente
Enum:
enum Status { Ok, Err(String) }
func Status.is_ok(self) { /* corpo */ }
let s = Status.Ok;
s.is_ok();
Regras:
- Primeiro parâmetro chamado exatamente
selfé removido da lista de parâmetros públicos e ligado implicitamente. - Métodos são registrados por tipo em
TypeRegistryno momento da definição. - Chamada:
inst.metodo(args)=> FieldAccess produz função bound comselfpredefinido. - Suporte tanto para variants sem payload (
Tipo.Variant) quanto shorthand (.Variant).
Introspecção em enums dentro do método:
- Identificadores especiais injetados:
variant(String) evalues(Array dos payloads)
Limitações atuais:
- Sem agrupamento
impl {}ainda. - Sem sobrecarga; resolução é por nome simples.
- Checagens de campo de struct mais profundas acontecem em runtime.
Próximos passos planejados:
- Bloco
impl Tipo { }agrupando métodos. - Inline caching e otimizações para chamadas quentes.
- Melhor diagnóstico para redefinição de método.
| Item | Descrição |
|---|---|
| Métodos reais | Sintaxe impl Tipo { func metodo(...) { } } |
Auto-binding self |
Implementado (forma sintaxe Tipo.metodo) |
| Inline caching | Otimizar chamadas frequentes |
| Tail-call otimization | Futuro em modo AOT |
| Anotações performáticas | Blocos performant { ... } futuros |