- Executar statements sequencialmente
- Avaliar expressões e produzir
ArtValue - Gerenciar ambientes léxicos aninhados
- Manter registro de tipos (structs, enums)
- Resolver pattern matching (com guards) e bindings
- Avaliar f-strings com especificadores de formatação
- Registrar e despachar métodos de structs e enums
- Coletar métricas de execução (erros tratados, statements executados)
- Primitivos: Int, Float, Bool, String
- Optional (None / Some)
- Array
- StructInstance
- EnumInstance
- Function (closure)
- BoundFunction (função já ligada a um
selfinterno para métodos)
Fluxo:
- Avalia callee
- Despacho:
- Function -> cria ambiente filho, injeta parâmetros
- BoundFunction -> usa ambiente baseado no
selfpré-capturado - Método:
inst.metodo()é resolvido via lookup noTypeRegistryproduzindo BoundFunction (auto-binding deselfquando primeiro parâmetro nomeado exatamenteself) - EnumInstance sem payload e chamado como construtor parcial: (futuro refinement)
- FieldAccess sem args sobre valor não chamável -> retorna o valor (fallback legado para arrays builtin)
Introspecção em enums dentro de métodos: nomes especiais variant e values são injetados ao entrar no corpo do método de enum (nome da variante e array dos valores/payloads).
pattern_matches retorna vetor de bindings (nome, valor) quando o padrão casa.
Suporta:
- Literal
- Wildcard
_ - Binding
let v(internamente representado comoBinding(Token)) - EnumVariant com parâmetros recursivos
- Guards:
case P if expr =>só casa seexprfor truthy após casarP.
Expr::WeakUpgrade(expr) (açúcar expr?) tenta upgrade de referência fraca retornando Optional.
Expr::UnownedAccess(expr) (açúcar expr!) acessa referência unowned (verifica dangling em debug, retorna none com diagnóstico no protótipo atual).
| Tipo | Condição |
|---|---|
| UndefinedVariable | Nome não encontrado no chain de ambientes |
| TypeMismatch | Operação inválida para tipos |
| DivisionByZero | Divisão por zero |
| WrongNumberOfArguments | Aridade incorreta em chamada |
| InvalidEnumVariant | Variante não existe |
| MissingField | Campo ausente em init de struct |
| Other | Mensagens gerais |
Todos os erros convertem-se em Diagnostic agregado; o interpretador não panica em entradas malformadas de usuário (meta: crash-free). Panics restantes são tratados como bugs e rastreados pelo script de scan.
Pipeline:
- Lexer produz token
InterpolatedStringbruto. - Parser divide em partes (texto literal, expressões, expr+spec).
- Durante execução cada expressão é avaliada e specs aplicadas em ordem:
upper/lower/trimhex(para inteiros -> hex minúsculo)padN(N decimal, padding à direita com espaços)debug(renderização estruturada futura; placeholder atual usa Display) Erros como chaves desbalanceadas oupadinválido viram diagnostics lex/parse dedicados.
Contadores internos:
handled_errors: incrementado ao agregar diagnostic de runtimeexecuted_statements: incrementado por statement avaliadocrash_free%: derivado para relatórios (futuro endpoint / comando)
Esses dados suportam monitorar estabilidade e orientar otimizações antes do JIT.
- Caching de lookup de variáveis
- Representação interna especializada para arrays numéricos
- JIT tiered (baseline + otimizado)
- Inline caching para chamadas de método frequentes
- Especialização de BoundFunction (monomorfização leve)
Sem side-effects escondidos além de println. Futuro: sandbox para FFI, mais validações de ownership nas fronteiras.