|
|
2 weeks ago | |
|---|---|---|
| .claude | 3 weeks ago | |
| docs | 3 weeks ago | |
| lua | 3 weeks ago | |
| src | 2 weeks ago | |
| .gitignore | 3 weeks ago | |
| Cargo.lock | 2 weeks ago | |
| Cargo.toml | 2 weeks ago | |
| README.md | 2 weeks ago | |
README.md
a
a embeds a Lua interpreter and adds a standard library and IO access, so a script can reach the network, a database, the filesystem, and the terminal without additional setup.
a file.lua # run a script
a # start an interactive REPL
Run a with a script path to execute it, or with no arguments to start an
interactive REPL.
The REPL
Running a with no arguments starts a read-eval-print loop in the same
sandboxed environment used for scripts, with the full standard library
available. It is convenient for trying out the library or exploring data.
- Bare expressions print their value (
1 + 1→2); tables are pretty-printed withutils.dump. - Statements that span several lines (a
forloop, a function body) are detected as incomplete and keep reading until they parse. - Async calls such as
os.sleep,http.get, andtask.joinsuspend and resume just as they do in a script — each entry runs on the async executor. - Line editing and history are provided, with history persisted to
~/.a_history. Press Ctrl-D to exit (os.exitis not available in the sandbox).
Each entry is compiled as its own chunk, so a local declared on one line is
not visible on the next — assign to a global (drop the local) to keep a value
across entries.
What it is
a is not a Lua implementation; it embeds Lua 5.5 (via mlua) and adds the parts stock Lua omits. Plain Lua ships almost no standard library and no way to reach the outside world without C modules and a build toolchain. a provides a standard library written partly in Rust and partly in Lua, together with IO access.
The result is a single binary that runs a .lua file. There is no package manager, build step, or project scaffolding.
The standard library
The standard library is the main purpose of a. Planned surface:
- Networking — HTTP client, WebSocket, and MQTT (3.1.1 and 5).
- SQLite — access to embedded SQLite databases.
- Filesystem — read/write/glob/walk without stock Lua's
ioboilerplate. - Terminal UI — interactive line editing and full-screen TUI, comparable to
ncurses.
The intent is for the common case to be a single call rather than a multi-step setup.
How it works
- Embeds Lua 5.5 via
mlua, on an async core (tokio) so IO-heavy scripts don't block. - A single self-contained binary. No LuaRocks, no make, no virtualenv.
- Scripts run in a sandboxed environment modeled on Luau's safe environment:
io,package, anddebugare not loaded;osis trimmed to its time functions; the bytecode/chunk-loading escape hatches (load,loadfile,dofile,string.dump) are removed. The libraryaprovides is the supported way to reach the outside world. - A leading
#!shebang line is skipped, so scripts can be made executable directly.
Building
cargo build --release
# binary at target/release/a
cargo run -- lua/test.lua # run a script during development
Requires a Rust toolchain (2024 edition). Lua is vendored and built from source, so no system Lua is needed.