Imports & Modules
Miri supports a module system that resolves imports, enforces visibility across module boundaries, and detects errors like circular dependencies and namespace collisions.
Import syntax
// Import all public entities from a module
use system.io
// Selective import
use system.io.{print, println}
// Module aliasing
use system.collections.list as L
// Multiple aliases in one statement
use system.{io, collections.map as M}
// Import from local project files
use local.models.user
use local.utils.math
Standard library modules
| Module | Contents |
|---|---|
system.io | print, println, eprint, eprintln |
system.string | String class with intrinsics |
system.math | abs, min, max, pow, sqrt, floor, ceil, round, sin, cos, tan, log, exp, PI, E, INF |
system.result | Result<T, E> with is_ok, is_err, unwrap_or |
system.testing | assert, assert_eq, assert_ne, assert_panics |
system.collections.array | Array methods + Queryable/Transformable/Foldable/Sequenced traits |
system.collections.list | List methods + Queryable/Transformable/Foldable/Sequenced traits |
system.collections.map | Map methods + ad-hoc map/filter/reduce |
system.collections.set | Set methods + ad-hoc map/filter/reduce |
Cross-module visibility
Visibility modifiers (public, private, protected) are enforced across module boundaries. Top-level functions and classes are public by default. Accessing a private symbol from another module produces a compile error.
// utils/helper.mi
public fn add(a int, b int) int
a + b
private fn internal_detail() int
42
// main.mi
use local.utils.helper
fn main()
let x = add(1, 2) // OK — add is public
// internal_detail() // Error — private to its module
Error detection
- Namespace collisions — Importing two modules that export the same name produces a compile error with suggestions for resolution (e.g., using aliased imports).
- Circular dependencies — If module
a.miimportsb.miandb.miimportsa.mi, the compiler reports the circular import chain with clear diagnostics.