Exportar Funções
Nesta página
O decorator @export marca uma função para ser exposta como símbolo público
do módulo wasm. Com o modo --aot --host browser, o compilador gera:
03-export.wasm— o módulo compilado03-export.js— wrappers JS tipados para cada função@export03-export.d.ts— declarações TypeScript correspondentes
Do lado JS/TS, o uso fica natural:
import init, { fib, greet, even } from "./03-export.js"
await init() // instancia o módulo
fib(10) // 55
greet("Zolo") // "Hello, Zolo!"
even(4) // true
Tipos na fronteira (MVP): int ↔ number, bool ↔ boolean,
str ↔ string, e retorno void. Strings cruzam a fronteira via glue
gerado (o loader escreve a string JS na memória wasm e lê o resultado de
volta); int e bool cruzam diretamente. Qualquer outro tipo em uma função
@export (float, arrays, structs) falha o build com
E_WasmAotUnsupportedFeature.
O código de nível superior continua executando em zolo_main() — chame-o
a partir do JS se precisar do efeito de inicialização:
Três funções @export com tipos de fronteira escalares: int, str e bool.
// Feature: export Zolo functions to JS/TS — `@export` (AOT wasm)
// Syntax: `@export fn name(args) -> T { ... }`
// When to use: build a Zolo library that JavaScript/TypeScript calls directly.
//
// Build (AOT, browser):
// zolo build 32-webassembly/03-export.zolo --emit wasm --host browser --aot \
// -o 32-webassembly/target/03-export.wasm
// # -> 03-export.wasm + 03-export.js (typed wrappers) + 03-export.d.ts
//
// Then from JS/TS:
// import init, { fib, greet, even } from "./03-export.js"
// await init() // instantiate the module
// fib(10) // 55
// greet("Zolo") // "Hello, Zolo!"
// even(4) // true
//
// Boundary types (MVP): int <-> number, bool <-> boolean, str <-> string,
// and a void return. Anything else on an @export (float, arrays, structs)
// fails the build with E_WasmAotUnsupportedFeature. Strings cross via the
// generated glue (it writes the JS string into wasm memory and reads results
// back); int/bool cross directly. `print` still goes to the console.
@export
fn fib(n: int) -> int {
if n < 2 { return n }
return fib(n - 1) + fib(n - 2)
}
@export
fn greet(name: str) -> str {
return "Hello, {name}!"
}
@export
fn even(n: int) -> bool {
return n % 2 == 0
}
// Top-level code still runs on `zolo_main()` (call it from JS if you want it).
"03-export loaded" |> print()
// expected (run natively): 03-export loaded
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
Desafio
Adicione uma quarta função @export fn square(n: int) -> int que retorna
n * n. Recompile e confirme que ela aparece no .d.ts gerado.
Veja também