| Crates.io | leo3 |
| lib.rs | leo3 |
| version | 0.1.6 |
| created_at | 2025-12-09 08:52:08.174156+00 |
| updated_at | 2025-12-14 06:24:21.399555+00 |
| description | Rust bindings for the Lean4 theorem prover |
| homepage | |
| repository | https://github.com/AndPuQing/leo3.git |
| max_upload_size | |
| id | 1975141 |
| size | 887,102 |
Leo3 provides safe, ergonomic Rust bindings to the Lean4 theorem prover, inspired by PyO3's architecture for Python-Rust bindings.
⚠️ Work in Progress - Leo3 is in early development. The core architecture is established, but many features are not yet implemented.
Leo3 is organized as a workspace with multiple crates:
leo3/
├── leo3 # Main crate - high-level safe abstractions
├── leo3-ffi # Raw FFI bindings to Lean4's C API
├── leo3-build-config # Build-time Lean4 detection and configuration
├── leo3-macros # Procedural macro entry points
└── leo3-macros-backend # Procedural macro implementations
Leo3 follows PyO3's proven architecture patterns:
#[repr(transparent)] wrappers with compile-time safetyLean<'l> token ensures Lean runtime initialization at compile-timeLean<'l> TokenAll Lean operations require a Lean<'l> token, proving the runtime is initialized:
use leo3::prelude::*;
fn process_data<'l>(lean: Lean<'l>) -> LeanResult<()> {
let s = LeanString::new(lean, "Hello, Lean!")?;
Ok(())
}
Leo3 provides two primary smart pointer types:
LeanBound<'l, T>: Tied to Lean<'l> lifetime, used for most operationsLeanRef<T>: Can cross initialization boundaries, useful for storageBoth handle reference counting automatically.
Lean types are wrapped in safe Rust types with automatic conversions:
use leo3::conversion::{IntoLean, FromLean};
// Strings
let s = LeanString::new(lean, "Hello")?;
let rust_str = LeanString::to_str(&s)?;
// Natural numbers
let n = LeanNat::from_usize(lean, 42)?;
let value = LeanNat::to_usize(&n)?;
// Signed integers (i8, i16, i32, i64, isize)
let rust_int: i32 = -42;
let lean_int = rust_int.into_lean(lean)?;
let back: i32 = FromLean::from_lean(&lean_int)?;
// Floating-point (f32, f64)
let rust_float: f64 = 3.14159;
let lean_float = rust_float.into_lean(lean)?;
let back: f64 = FromLean::from_lean(&lean_float)?;
// Option<T>
let rust_opt: Option<u64> = Some(42);
let lean_opt = rust_opt.into_lean(lean)?;
let back: Option<u64> = FromLean::from_lean(&lean_opt)?;
// Result<T, E>
let rust_result: Result<i32, String> = Ok(42);
let lean_result = rust_result.into_lean(lean)?;
let back: Result<i32, String> = FromLean::from_lean(&lean_result)?;
// Arrays and vectors
let vec = vec![1, 2, 3, 4, 5];
let lean_arr = vec.into_lean(lean)?;
let back: Vec<i32> = FromLean::from_lean(&lean_arr)?;
Note: Lean4 must be installed on your system. Leo3 will attempt to detect it via:
LEAN_HOME or ELAN_HOME environment variableslake commandelan toolchain managerlean in PATHAdd to your Cargo.toml:
[dependencies]
leo3 = "0.1.0"
use leo3::prelude::*;
#[leanfn]
fn add(a: u64, b: u64) -> u64 {
a + b
}
fn main() -> LeanResult<()> {
// Initialize Lean runtime
leo3::prepare_freethreaded_lean();
leo3::with_lean(|lean| {
// Create Lean objects
let s = LeanString::new(lean, "Hello from Rust!")?;
println!("Created string: {}", LeanString::to_str(&s)?);
let n = LeanNat::from_usize(lean, 100)?;
println!("Created nat: {}", LeanNat::to_usize(&n)?);
Ok(())
})
}
macros (default): Enable procedural macros (#[leanfn], #[leanclass], etc.)Leo3 adapts PyO3's architecture for Lean4:
| PyO3 Concept | Leo3 Equivalent | Notes |
|---|---|---|
Python<'py> |
Lean<'l> |
Runtime initialization token |
Bound<'py, T> |
LeanBound<'l, T> |
Lifetime-bound smart pointer |
Py<T> |
LeanRef<T> |
Unbound smart pointer |
#[pyfunction] |
#[leanfn] |
Function export macro |
#[pyclass] |
#[leanclass] |
Class export macro (planned) |
PyObject |
lean_object |
Base object type |
| GIL | Lean runtime | No equivalent (Lean has no GIL) |
#[leanfn] macro implementation#[leanclass] for Rust structs as Lean classes#[leanmodule] for module creation# Build all crates
cargo build
# Build specific crate
cargo build -p leo3-ffi
# Run tests
cargo test
Currently, most tests are unit tests. Integration tests requiring a Lean4 installation will be added.
Contributions are welcome! Areas that need work:
Licensed under either of:
at your option.