🐇

Moonbitのパッケージレジストリである mooncakes.io を眺める

に公開

https://qiita.com/advent-calendar/2025/moonbit の二日目の記事です。(時間と空間は相対的なものであり、時系列が歪んでいてもあとで読む人には関係ありません)

mooncakes.io はパッケージレジストリです。rubygems や crates.io, PyPI のようなものです。

https://mooncakes.io/

この記事では、 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

https://mooncakes.io/docs/moonbitlang/core

公式。ビルトインの標準ライブラリです。

moon build --nostd を指定しない限り、暗黙に読み込まれます。

moonbitlnag/async

https://mooncakes.io/docs/moonbitlang/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

https://mooncakes.io/docs/moonbitlang/x

公式。moonbitlang/core に含まれない実験的な準標準ライブラリです。

json5, encoding, crypto, decimal, path などが含まれています。

moonbitlang/parser

https://mooncakes.io/docs/moonbitlang/parser

公式。Moonbit 言語自体のパーサ。

ちょっと触った感じ、ASTがまだ安定していないです。

oboard/mocket

https://mooncakes.io/docs/oboard/mocket

いわゆるウェブフレームワーク。

let app = @mocket.new()
app.get("/", _ => "Hello, Mocket!")
app.serve(port=4000)

https://mocket.oboard.fun/

oboard/moonbit-eval

https://mooncakes.io/docs/oboard/moonbit-eval

Moonbit の REPL というかインタープリターの実装になっています。

Kaida-Amethyst/mbtcc

https://mooncakes.io/docs/Kaida-Amethyst/mbtcc

Moonbit による C コンパイラ実装

Kaida-Amethyst/llvm

https://mooncakes.io/docs/Kaida-Amethyst/llvm

mbtcc と組み合わせて使う前提の LLVM ユーティリティ

Kaida-Amethyst/python

https://mooncakes.io/docs/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

https://mooncakes.io/docs/Yoorkin/rabbit-tea

Elm インスパイアの宣言的UIライブラリ。

tonyfettes/tree_sitter

https://mooncakes.io/docs/tonyfettes/tree_sitter

tree-sitter のバインディング。エディタ周辺ツールを作る人へ。

tonyfettes/lua

https://mooncakes.io/docs/tonyfettes/lua

Lua Binding

tonyfettes/openai

https://mooncakes.io/docs/tonyfettes/openai

openai client

bobzhang/unmarshal

https://mooncakes.io/docs/bobzhang/unmarshal

ocaml の Marshal されたバイナリを Moonbit から Decode するライブラリ。

https://ocaml.org/manual/5.4/api/Marshal.html

これ自体が重要というより、Moonbit コンパイラ自体の大部分が OCaml による実装なので、これがあるということで実装をイメージしやすくなります。

rami3l/js-ffi

https://mooncakes.io/docs/rami3l/js-ffi

一番依存が多い js-ffi です。

mizchi/libgit2

https://mooncakes.io/docs/mizchi/libgit2

拙作。libgit2 のバインディング。

mizchi/cbor

https://mooncakes.io/docs/mizchi/cbor

拙作。Pure Moonbit の cbor エンコーダ・デコーダです。

手元ではベンチマークでは、文字列以外は Rust 実装より高速になりました。あとで記事を書きます。

mizchi/js

https://mooncakes.io/docs/mizchi/js

拙作。browser/node/deno へのバインディング。npm ライブラリ50個ほどへのFFI含む。

mizchi/cloudflare

https://mooncakes.io/docs/mizchi/cloudflare

拙作。mizchi/js を使って cloudflare worker のバインディング。

全体的な肌感

自作ライブラリを紹介しておいてなんですが、コア開発者らのパッケージと標準ライブラリを中心に使うのがいいと思います。半年以上前のライブラリは構文エラーか、セマンティクスの違反かであまり動きません。

アクティブにメンテナンスされてるのがコア開発者周辺のライブラリなので、やはりコンパイラ周辺のツールチェインに偏っています。

自分の手元にまだ公開してない v8 バインディングと sqlite バインディングもあるので、あとでライブラリとして公開して記事にしたいですね。それじゃ

Discussion