____ _ ____ _
| _ \(_)_ __ / ___|___ __| | ___
| |_) | | '_ \ | / _ \ / _` |/ _ \
| _ <| | |_) | |__| (_) | (_| | __/
|_| \_\_| .__/ \____\___/ \__,_|\___|
|_|
A destructive-first programming language that transpiles to JavaScript.
RipCode combines a metal/cyberpunk aesthetic with real programming power. Forge variables, shred through loops, pipe data through riffs, and mosh your async operations β all transpiled to clean, runnable JavaScript.
npm install -g ripcodeOr try it without installing:
npx ripcode run hello.rip# Create a new project
rip init my-project
cd my-project
# Run it
rip run main.rip
# Or build to JavaScript
rip build main.rip -o out.js// hello.rip
say "Hello, world!"
forge name = "RipCode"
say "Welcome to ${name} π€"
rip run hello.ripforge x = 10 // let x = 10
lock PI = 3.14 // const PI = 3.14
forge obj = { name: "rip", version: 1 }
rip name, version from obj
forge arr = [1, 2, 3]
rip a, b, c from arr
// Single expression (auto-returns)
riff double(x) -> x * 2
// Block body
riff greet(name) {
forge msg = "Hey, ${name}!"
say msg
return msg
}
// Default params + rest
riff log(level = "info", ...args) {
say level, args
}
Chain data through functions left-to-right:
riff double(x) -> x * 2
riff addTen(x) -> x + 10
riff square(x) -> x * x
forge result = 5 ~> double ~> addTen ~> square
say result // 400
whisper "debug info" // console.debug
say "normal output" // console.log
yell "warning!" // console.warn
scream "EVERYTHING BROKE" // console.error
// For-of loop
forge items = ["guitar", "bass", "drums"]
shred items as item {
say item
}
// While loop
forge count = 3
while count > 0 {
say "${count}..."
count = count - 1
}
forge score = 95
if score >= 90 {
say "A β shredding it!"
} else if score >= 80 {
say "B β solid riff"
} else {
yell "Needs practice"
}
forge double = |x| -> x * 2
forge add = |a, b| -> a + b
say double(21) // 42
say add(20, 22) // 42
brace {
// risky code here
forge data = riskyOperation()
} recover err {
scream "Crashed: ${err}"
}
mosh {
fetchUsers(),
fetchPosts(),
fetchComments()
} -> results
// Import
grab { readFile } from "fs"
grab path from "path"
// Export
riff helper() -> "help"
drop helper
drop { helper, anotherFn }
forge name = "world"
forge greeting = "Hello, ${name}!"
forge math = "2 + 2 = ${2 + 2}"
| Command | Description |
|---|---|
rip run <file.rip> |
Transpile and execute |
rip build <file.rip> [-o out.js] |
Transpile to JavaScript |
rip init [name] |
Scaffold a new project |
rip repl |
Interactive RipCode REPL |
rip version |
Show version |
rip help |
Show help |
Hidden Commands
RipCode has 35 easter eggs baked in. Here are the ones we'll admit to:
| Command | What it does |
|---|---|
rip solo |
Animated ASCII guitar solo |
rip lore |
Typewriter-style origin story |
rip noise |
Visual hierarchy of noise levels |
rip 666 |
Number of the Beast Mode |
rip credits |
Movie-style rolling credits |
rip unleash |
Opens the Actor Arsenal |
rip quake |
Plays the Quake theme (macOS, caches on first use) |
rip hierarchy |
DOOM-style boss health bars for your project |
rip battle <f1> <f2> |
Two .rip files fight in a 6-round tournament |
rip sacrifice <file> |
Dramatic file deletion (recoverable) |
rip resurrect [file] |
Bring a file back from the graveyard |
rip fortune |
Metal fortune cookie |
rip rage <msg> |
Escalating ASCII rage |
rip summon-kenny-g |
The ultimate punishment |
rip roast <file> |
Metric-based code roast |
rip roastme |
Random humor from the rip-on-shit engine |
rip headcount |
How many secrets exist |
There are also date-triggered surprises, a 5% chance of random quips, a Konami code in the REPL, and other things you'll have to find yourself.
// Battle cries β comments that survive transpilation
//! DESTROY ALL SEMICOLONS
// Headbang β the metal no-op
headbang
// Encore β repeat the previous statement
say "Hello!"
encore
// Summon β alt import syntax
summon { readFileSync } from "fs"
// Scream auto-caps at runtime
scream "this becomes ALL CAPS"
// The answer to everything
say 42 // prints: 42 (The Answer)
// The meaning of life
forge _meaning_of_life = 43 // transpiler adds: /* are you sure? */
Every transpiled file ends with // Forged with RipCode π€
| RipCode | JavaScript |
|---|---|
forge x = 10 |
let x = 10 |
lock PI = 3.14 |
const PI = 3.14 |
rip a, b from obj |
const { a, b } = obj |
riff fn(x) -> x * 2 |
function fn(x) { return x * 2 } |
data ~> fn1 ~> fn2 |
fn2(fn1(data)) |
whisper "x" |
console.debug("x") |
say "x" |
console.log("x") |
yell "x" |
console.warn("x") |
scream "x" |
console.error("x") |
shred arr as x { } |
for (const x of arr) { } |
brace { } recover { } |
try { } catch(e) { } |
mosh { } -> r |
await Promise.all([...]) |
grab { x } from "y" |
const { x } = require("y") |
drop fn |
module.exports.fn = fn |
|x| -> x * 2 |
(x) => x * 2 |
RipCode has themed error messages:
π₯ TRACK SCRATCHED (Syntax Error)
at line 5, col 12
Unexpected token 'blah' β expected '}'
π GHOST NOTE (Reference Error)
at line 8
'userName' doesn't exist in this pit
πΈ BROKEN STRING (String Error)
at line 3
Unterminated string β did you forget to close your quotes?
Check out the examples/ directory:
hello.ripβ Noise levels and basic variablespipeline.ripβ Data pipelines with~>mosh.ripβ Loops, conditionals, grade reportfull-demo.ripβ Complete feature showcaseeaster-eggs.ripβ Hidden language features showcase
RipCode is a source-to-source transpiler:
- Lexer (
src/lexer.js) β Tokenizes.ripsource code - Parser (
src/parser.js) β Recursive descent parser β AST - Transpiler (
src/transpiler.js) β AST β JavaScript - Runtime (
src/runtime.js) β Helper functions (pipelines, mosh, noise)
Zero dependencies. Pure Node.js.
MIT