← Back to Blog

Why Another Programming Language?

January 1, 2025 philosophydesign

The world has hundreds of programming languages. Many are excellent. So why spend years building Lateralus? This is my attempt to answer that question honestly.

◉ The Frustration

I've used dozens of languages professionally: C, C++, Python, JavaScript, Rust, Go, Haskell, OCaml, Ruby, Perl, and more. Each solves some problems well and creates others. The pattern I kept hitting:

The specific frustration: I was constantly switching languages based on task type. Shell script for glue, Python for quick analysis, Rust for the actual program, JavaScript for the web UI. Four languages, four mental models, four build systems.

◉ The Insight

Most code I write, regardless of language, follows the same pattern:

1. Get data from somewhere
2. Transform it through stages
3. Put data somewhere else

This is a pipeline. ETL systems know this. Unix pipes know this. Data engineering knows this. But most programming languages treat pipelines as a library feature, not a core primitive.

What if a language was designed from scratch around data flow?

◉ Data Flow First

Lateralus puts the pipeline operator at the center of everything:

// This isn't "sugar" — it's the primary way to express computation
let result = input
    |> parse()
    |> validate()
    |> transform()
    |> output()

// Compare to nested calls
let result = output(transform(validate(parse(input))))

The pipeline version reads in the order operations happen. The nested version requires reading inside-out. This isn't just aesthetics — it changes how you think about programs.

◉ Systems + Scripts

Lateralus compiles to multiple targets from the same source:

Same language for your automation script and your OS kernel. No context switching, no rewriting when performance matters.

// Quick script for data analysis
cat("data.json") |> json.parse() |> filter(_.active) |> map(_.name) |> println()

// Same language for kernel driver
@freestanding
fn handle_interrupt(irq: u8) {
    let handler = interrupt_table[irq]
    handler() |> log_if_error()
}

◉ Thoughtful Defaults

Every language makes choices. These are ours:

Choice Default Opt-in Alternative
MutabilityImmutablelet mut
NullabilityNo nullOption[T]
Pattern matchingExhaustive_ => ... catch-all
Error handlingResult[T,E]panic() for unrecoverable
ConcurrencyStructured (scoped)spawn for raw tasks
VisibilityPrivatepub

These defaults create a "pit of success" — the easy way to write code is also the safe way.

◉ What Lateralus Is Not

Honest about limitations:

◉ Who Is This For?

Lateralus might fit if you:

◉ The Name

"Lateralus" — from the Tool album. The Fibonacci spiral, thinking laterally, patterns that expand outward. Data flowing through transformations. It felt right.

Try it in the playground or check the source on GitHub.