3 stable releases
Uses new Rust 2024
| 1.4.0 | Feb 9, 2026 |
|---|---|
| 1.3.2 | Feb 9, 2026 |
| 1.3.0 | Feb 8, 2026 |
#1390 in Embedded development
Used in 5 crates
(3 directly)
285KB
3.5K
SLoC
Grift Core Types
Core types and Lisp context for the Grift R7RS-compliant Scheme implementation.
This crate contains the fundamental types shared between the parser and evaluator:
Value— The core value enum representing all Lisp typesBuiltin— Enum of built-in functionsStdLib— Enum of standard library functionsLisp— The Lisp execution context wrapping an arena
Design
- Symbols use contiguous string storage for memory efficiency
- Symbol interning ensures the same symbol name returns the same index
- All values are stored in a
grift_arenaarena - Supports garbage collection via the
Tracetrait - Explicit boolean values (#t, #f) separate from nil/empty list
- Strict evaluation - All arguments are evaluated before function application (call-by-value)
- Pluggable I/O - The [
io] module defines theIoProvidertrait so the evaluator staysno_stdwhile real I/O can be supplied on hosted platforms (seegrift_std::StdIoProvider). ANullIoProvideris provided for environments without I/O.
Value Representation
Nil- The empty list (NOT false!)True- Boolean true (#t)False- Boolean false (#f)Number(isize)- Integer numbersChar(char)- Single characterCons { car, cdr }- Pair/list cell with inline indicesSymbol(ArenaIndex)- Symbol pointing to interned stringLambda { params, body_env }- Closure with inline indicesBuiltin(Builtin)- Optimized built-in functionStdLib(StdLib)- Standard library function (static code, parsed on-demand)Array { len, data }- Vector with inline lengthString { len, data }- String with inline lengthNative { id }- Native Rust function reference
Reserved Slots
The Lisp singleton values (nil, true, false) are pre-allocated in reserved slots at initialization time.
The first 4 slots of the arena are reserved:
- Slot 0:
Value::Nil- empty list singleton - Slot 1:
Value::True- boolean true singleton - Slot 2:
Value::False- boolean false singleton - Slot 3:
Value::Cons- intern table reference cell
Pitfalls and Gotchas
Truthiness
- Only
#fis false! Everything else is truthy, including:nil/'()(the empty list)0(the number zero)- Empty strings
Garbage Collection
- The intern table is always a GC root - interned symbols are never collected
- Reserved slots (nil, true, false) are implicitly preserved
- Run
gc()with appropriate roots to reclaim memory
StdLib Functions
- Body is parsed on each call (minor overhead, but keeps code out of arena)
- Recursive stdlib functions work via the global environment
- Errors in static source strings are only caught at runtime