# cljrs-stdlib
Built-in standard library namespaces for clojurust, distributed as embedded
source + native Rust helpers.
## Status
Phase 8-ext. Provides `clojure.string`, `clojure.set`, and `clojure.test` as
lazily-loaded built-ins; no filesystem dependency at runtime.
## Purpose
Clojurust has no classpath or JAR mechanism. This crate solves the distribution
problem by embedding `.cljrs` source files via `include_str!` and registering
them in `GlobalEnv::builtin_sources` so that `(require '[clojure.string :as str])`
works out of the box in any binary that calls `cljrs_stdlib::standard_env()`.
## File layout
```
src/
lib.rs Public API: register(), standard_env(), standard_env_with_paths()
string.rs Native Rust implementations for clojure.string
set.rs Native Rust implementations for clojure.set
clojure/
string.cljrs Clojure source for clojure.string (ns decl; natives pre-registered)
set.cljrs Clojure source for clojure.set (ns decl; natives pre-registered)
test.cljrs Pure Clojure implementation of clojure.test
build.rs Pre-lowers clojure.core to optimized IR (gated on the
`prebuild-ir` feature) — runs the ANF lowerer *and*
the escape-analysis/region-allocation optimize pass,
so the resulting bundle includes the RegionStart/
RegionAlloc instructions consumed by the IR
interpreter. Output: `$OUT_DIR/core_ir.bin`.
```
## Public API
### Entry points
```rust
/// Register all built-in stdlib namespaces into an existing GlobalEnv.
pub fn register(globals: &Arc<GlobalEnv>);
/// Create a GlobalEnv with bootstrap + stdlib registered (lazy loading).
pub fn standard_env() -> Arc<GlobalEnv>;
/// Like standard_env() but also sets user source paths for require.
pub fn standard_env_with_paths(source_paths: Vec<PathBuf>) -> Arc<GlobalEnv>;
```
### Namespaces provided
| `clojure.string` | `string.rs` + `clojure/string.cljrs` | Native Rust, loaded lazily |
| `clojure.set` | `set.rs` + `clojure/set.cljrs` | Native Rust, loaded lazily |
| `clojure.test` | `clojure/test.cljrs` | Pure Clojure, loaded lazily |
### clojure.string functions
`upper-case`, `lower-case`, `capitalize`, `trim`, `triml`, `trimr`,
`trim-newline`, `blank?`, `starts-with?`, `ends-with?`, `includes?`,
`replace`, `replace-first`, `split`, `split-lines`, `join`,
`index-of`, `last-index-of`
### clojure.set functions
`union`, `intersection`, `difference`, `subset?`, `superset?`,
`select`, `map-invert`
## Dependency notes
- `cljrs-stdlib` depends on `cljrs-eval` (for `GlobalEnv`, `standard_env_minimal`)
- `cljrs-eval` does **not** depend on `cljrs-stdlib` (no circular dep)
- The `cljrs` binary depends on both; use `cljrs_stdlib::standard_env()` instead of
`cljrs_eval::standard_env()` so that stdlib namespaces are available