在 MoonBit 中引入虚拟包

MoonBit recently introduced virtual package feature. Users can declare a package as virtual and define interfaces via .mbti files to choose implementation. If no implementation is specified, default is used. This provides flexibility in separating interfaces from implementations (experimental).

Example project structure:

.
├── virtual // Declared as virtual with virtual.mbti defining interfaces
├── impl    // Custom implementation for virtual package interfaces
├── lib     // Depends on virtual package interfaces
└── main    // Depends on lib and overrides virtual package default implementation with impl

Declaring a virtual package: In moon.pkg.json of virtual package, set "virtual": {"has-default": true}. Package must include .mbti file.

Providing custom implementation: In moon.pkg.json of impl package, set "implement": "username/hello/virtual". Implementation must satisfy virtual package .mbti file.

Using a virtual package: In moon.pkg.json of lib package, add virtual package in "import" field.

Overriding a virtual package: In moon.pkg.json of main package, specify implementation package in "overrides" field. If no implementation and default, default is used; if no default, error.

Example in moonbitlang/core:

  • abort.mbti declares APIs.
  • abort.mbt provides default implementation with panic_impl. Current default ignores msg to avoid depending on spectest::print_char in other runtimes.

Customizing implementation: Run moon add moonbitlang/dummy_abort and add "overrides": ["moonbitlang/dummy_abort/abort_show_msg"] to moon.pkg.json. Now abort passes and prints the parameter.

Intentionally misusing swap on an array shows an error message. In the future, MoonBit community plans to provide WASI standard compliant libraries for println to run on WebAssembly runtimes.

New to MoonBit:

阅读 60
0 条评论