Moonbitのパッケージレジストリである mooncakes.io を眺める
https://qiita.com/advent-calendar/2025/moonbit の二日目の記事です。(時間と空間は相対的なものであり、時系列が歪んでいてもあとで読む人には関係ありません)
mooncakes.io はパッケージレジストリです。rubygems や crates.io, PyPI のようなものです。
この記事では、 mooncakes に使えそうなライブラリを紹介します。(先に言ってしまうと、そう多くはありません)
moonbit のライブラリは大きく二つに分類でき、Pure Moonbitの実装でどこでも動くものと、特定のバックエンドで動くものがあります。例えば moonbitlang/core は Pure Moonbit の標準ライブラリであり、UIライブラリの Yoorkin/rabbit-tea は js のみで動きます。ネイティブバインディングの mizchi/libgit2 は native のみです。
最初に: サードパーティライブラリの使い方
# プロジェクト生成
moon new myapp && cd myapp
# 依存を追加
moon add mizchi/cbor
# バックエンドを指定してビルド
moon build --target native
moon add で は moon.mod.json の deps として書き込まれ、この場合は .mooncakes/mizchi/cbor にソースコードがまるっとコピーされます。
これ+ライブラリを import したい.mbt があるのと同じディレクトリの moon.pkg.json で、 import を指定する必要があります。
{
"import": [
"mizchi/cbor"
]
}
これで @cbor.encode() のように呼べるようになります。
moonbitlang/core
公式。ビルトインの標準ライブラリです。
moon build --nostd を指定しない限り、暗黙に読み込まれます。
moonbitlnag/async
公式。非同期まわりのイベントループの実装です。Rust tokio, Node.js の libuv のようなものです。
現状、システムコールやFS周りのAPIもここに含まれており、fs, pipe, process, socket, tls などはイベントループと組み合わせる前提でここに含まれています。
またこのライブラリを依存に含めることを前提に、一部の言語機能を有効化することができます。
async test "async test" {
@async.sleep(100)
assert_true(true)
}
--target js と --target native では、このライブラリを依存に含めた時限定で、async test {}と, async fn main {} が使えるようになります。
これは隠し機能というより、入れてなくてもコンパイルエラーとして警告されるのですぐに気づくでしょう。
moonbitlang/x
公式。moonbitlang/core に含まれない実験的な準標準ライブラリです。
json5, encoding, crypto, decimal, path などが含まれています。
moonbitlang/parser
公式。Moonbit 言語自体のパーサ。
ちょっと触った感じ、ASTがまだ安定していないです。
oboard/mocket
いわゆるウェブフレームワーク。
let app = @mocket.new()
app.get("/", _ => "Hello, Mocket!")
app.serve(port=4000)
oboard/moonbit-eval
Moonbit の REPL というかインタープリターの実装になっています。
Kaida-Amethyst/mbtcc
Moonbit による C コンパイラ実装
Kaida-Amethyst/llvm
mbtcc と組み合わせて使う前提の LLVM ユーティリティ
Kaida-Amethyst/python
解説記事見ても仕組みが全然わからなかったのですが、Python VM のバインディングらしいです。
ttps://www.moonbitlang.com/blog/moonbit-x-python
fn main {
// It's equivalent to `nums = [1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4]`
let nums = [1L, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
let py_nums = nums.map(PyInteger::from) |> PyList::from
println(py_nums) // Output: [1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
// It's equivalent to `import collections`
guard @python.pyimport("collections") is Some(collections)
}
Yoorkin/rabbit-tea
Elm インスパイアの宣言的UIライブラリ。
tonyfettes/tree_sitter
tree-sitter のバインディング。エディタ周辺ツールを作る人へ。
tonyfettes/lua
Lua Binding
tonyfettes/openai
openai client
bobzhang/unmarshal
ocaml の Marshal されたバイナリを Moonbit から Decode するライブラリ。
これ自体が重要というより、Moonbit コンパイラ自体の大部分が OCaml による実装なので、これがあるということで実装をイメージしやすくなります。
rami3l/js-ffi
一番依存が多い js-ffi です。
mizchi/libgit2
拙作。libgit2 のバインディング。
mizchi/cbor
拙作。Pure Moonbit の cbor エンコーダ・デコーダです。
手元ではベンチマークでは、文字列以外は Rust 実装より高速になりました。あとで記事を書きます。
mizchi/js
拙作。browser/node/deno へのバインディング。npm ライブラリ50個ほどへのFFI含む。
mizchi/cloudflare
拙作。mizchi/js を使って cloudflare worker のバインディング。
全体的な肌感
自作ライブラリを紹介しておいてなんですが、コア開発者らのパッケージと標準ライブラリを中心に使うのがいいと思います。半年以上前のライブラリは構文エラーか、セマンティクスの違反かであまり動きません。
アクティブにメンテナンスされてるのがコア開発者周辺のライブラリなので、やはりコンパイラ周辺のツールチェインに偏っています。
自分の手元にまだ公開してない v8 バインディングと sqlite バインディングもあるので、あとでライブラリとして公開して記事にしたいですね。それじゃ
Discussion