Transform values through pipelines

Expression language for composing immutable data transformations. Domain-agnostic. Pure. Runs in the browser.

|~| Vec → filter → count
> [1 2 3 4 5] | filter(gt(3)) | count
2
|~| bind name · spread over Vec
> let(:double, mul(2)) | [10 20 30] * double
[20 40 60]
|~| parametric conduit · @-effectful binding
> let(:@surround, [:pfx, :sfx], prepend(pfx) | append(sfx))
  | "world" | @surround("[", "]")
"[world]"
|~| source → AST-Map → pipeValue
> "10 | add(3)" | parse | eval
13

What is qlang?

A pure expression language for transforming immutable values through pipelines. 69 built-in operands, five value types, two-track error model, parametric conduits, live REPL in the browser.

Pipeline composition

Thread values through chains of operands with |, distribute with *, merge with >>.

Immutable value types

Scalar, Vec, Map, Set, Error — all frozen. No mutation, no surprises.

Two-track error model

Success-track | deflects on errors, fail-track !| fires. Trail accumulates deflected steps as data.

Code as data

parse lifts source to an AST-Map, eval re-enters the evaluator. The ring closes.

Conduits

let binds named pipeline fragments with parameters. Lexical scope, recursive self-reference, zero-arity aliases.

Effect markers

@-prefixed identifiers carry side effects visibly. The runtime enforces propagation — no laundering.

Try it

Type a qlang expression and press Enter. The evaluator runs entirely in your browser.

>