████ blue nord7 → nord8 → nord9 → nord10
──────────────────── teal cyan light deep blue
a Ruby/Elixir surface on tatara-lisp and Rust
blue is the pleme-io language. A Ruby/Elixir surface parses to a tatara-lisp AST, macros are term rewriting on that AST, and the runtime is Rust — not the BEAM.
Four solid cells walking Nord's Frost band toward blue. Blueshift is blue's central metaphor — the wave that shifts with you across tatara-lisp and Rust as you write — and a blueshift is a shift in colour, so the mark shifts colour.
Named by ANSI slot, never by hex, so it renders in your Nord and follows you if you retheme.
Declare nothing and blue is dynamic and fast. Annotate one function and that function gets analysis. Nothing else changes — same tree, same answer, same speed.
def add(a, b) # no annotation, no analysis
a + b
end
def fact(n: Int) -> Int # annotated — this one is checked
if n < 2
1
else
n * fact(n - 1)
end
end
blue check prints what that cost, so the claim is a measurement rather than a
promise:
$ blue check example.b
typed declarations: 1
nodes analysed: 11
seams: 0
nix run github:pleme-io/blue -- run example.b
| Command | |
|---|---|
blue run FILE |
parse, type-check, erase, execute |
blue test FILE |
run the file's test blocks |
blue fmt FILE [--check|--write] |
the one formatting |
blue check FILE |
what the type checker did |
blue ast FILE / blue erase FILE |
the tree with and without annotations — the sliding scale, visible |
blue deps FILE / blue posture FILE |
read a Bluefile |
blue lsp |
language server over stdio |
blue banner |
the wordmark |
Macros with bounded expansion — a runaway macro is a typed error naming the macro, not a dead compiler. OTP-style supervision with private per-process environments and copy-on-send. A test framework whose failures print the expression as blue source. A package manager whose manifest is itself a blue program. A WASM target that runs the whole language in an engine with zero host imports.
$ blue test spec/macros.b
FAIL a macro expands
assert double(21) == 43
3 test(s): 2 passed, 1 failed
The failure message is the formatter's output, so it reads exactly as written.
Stated plainly, because a language's honest gaps matter more than its claims:
- No per-process GC heap. Processes have private environments and messages
are deep-copied, but reclamation is
Arcrefcounting — there is no independent per-process collection pause. - Not self-hosted. The toolchain is Rust.
spec/*.bis blue specifying blue, which is the specification axis only. - Nothing fetches. Dependency resolution is real; there is no registry client.
- The formatter refuses a comment it cannot place. Comments before or after a top-level form are preserved; one buried inside an expression is refused rather than dropped, because those lines get re-laid out.
The full tier ledger — every row marked SHIPPED or ABSENT — is
theory/BLUE.md §V.26.
Colours come from irodori, the fleet's
Nord palette. blue carries no hex of its own: nord10 (#5E81AC, deep frost
blue) is its identity, and nord8 frost-cyan stays the fleet's shared
interaction colour — identity and interaction are different roles.
nix build .#blue # hermetic
cargo test --workspace # 306 tests
MIT.