Pular para o conteúdo

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 compilado
  • 03-export.js — wrappers JS tipados para cada função @export
  • 03-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): intnumber, boolboolean, strstring, 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.

03-export.zolo
Playground
// 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.

Buscar no Zolo

9 resultados

enespt-br