(rontolisp) docs
← WIT 契約 (rontolisp.wit)

rontolisp.wit/export

[rontolisp.wit :as wit] での (export "path.wit") または (export "path.wit" {:world "name"})

プログラムが WIT の world を実装すると宣言します。world の各エクスポートは、現在の 名前空間でそのラベルが指す var(ファイルのどこで定義した defn でも、refer した var でも よい)で、モジュールはそれを world の型でエクスポートします(WIT 契約)。 ファイルが複数の world を宣言しているときは :world で選びます。WIT ファイルは、load と 同じく、それを書いたファイルからの相対パスです。

$ cat wit/greeter.wit
package example:greeter@0.1.0;

world greeter {
  export greet: func(name: string) -> string;
  export is-short: func(name: string) -> bool;
}
$ cat greeter.clj
(ns greeter (:require [rontolisp.wit :as wit]))

(wit/export "wit/greeter.wit")

(defn greet [name] (str "Hello, " name "!"))
(defn is-short [name] (< (count name) 5))
$ rontolisp greeter.clj -o greeter.wasm --component --emit-wit
$ wasmtime run --invoke 'is-short("Grace")' greeter.wasm
false

world はプログラムのエクスポートの全リストなので、隣に rontolisp.wasm/export を書くと拒否します。world はどのターゲットでもコンパイル時に検査し、var のないエクスポート、 引数の数に合うアリティのない defn、エクスポート境界が扱えない型、async func は、 いずれも WIT の行を名指して拒否します。bool は true か false として渡り、引数をちょうど 取る単一アリティの defn でないエクスポートは、rontolisp.wasm/export と 同じく、そのアリティで var を呼ぶ関数を介します。--emit-wit は world を引数名ごと 書き戻します。

REPL では、world はその時点までの定義に照らして検査されます。先に関数を定義してください。