gymlang
Version:
A programming language for gym bros, by gym bros. Where every program is a gains program! 💪
82 lines (74 loc) • 2.66 kB
JavaScript
/* GymLang — a tiny meme language in gym slang
*
* Syntax (whitespace-separated, one command per line):
* BRO <name> <number> # declare variable with bro energy
* BULK <name> <number> # add to variable (bulking season)
* SHRED <name> <number> # subtract from variable (shredding)
* GAINS <name> <number> # multiply variable (muscle gains)
* CARDIO <name> <number> # divide variable (cardio kills gains)
* REPS <vals...> # sum args and print
* CREATINE <vals...> # multiply args and print
* PR <high/low> <vals...> # find max/min of args (pump it up!)
* YOLO <name> # random value (you only live once)
* WHEY <name> <number> # exponentiate value (get whey!)
* LEGDAY <name> # skip leg day (set to 0)
* HUSTLE <up/down> <name> # round up/down (hustle harder)
* FLEX <value|name|"str"> # print value (show off)
*
* Extras:
* - Comments start with '#'
* - Strings use double quotes, e.g., "No pain, no gain"
* - Numbers can be integers or decimals
* - Built-in gym bro wisdom and motivation
*/
;
const { lineTokeniser } = require("./src/tokeniser.js");
const { lineInterpreter } = require("./src/interpreter.js");
const { pathHandler } = require("./lib/pathHandler.js");
/* =========================
* Runner (multi-line program)
* ========================= */
function runProgram(text) {
const env = { vars: Object.create(null) };
const lines = text.split(/\r?\n/);
for (let ln = 0; ln < lines.length; ln++) {
const line = lines[ln];
try {
const tokensedLine = lineTokeniser(line);
lineInterpreter(tokensedLine, env);
} catch (e) {
// enrich error with line number/context
const where = `Line ${ln + 1}: ${line.trim()}`;
const msg = e && e.message ? e.message : String(e);
throw new Error(`${msg}\n -> ${where}`);
}
}
return env; // expose env for tests/embedding
}
/* =========================
* CLI
* =========================
* Usage:
* gymlang sample.gym
* gymlang --help
* gymlang --version
*/
if (require.main === module) {
const fs = require("fs");
const path = pathHandler(process.argv[2]);
try {
const src = fs.readFileSync(path, "utf8");
runProgram(src);
} catch (err) {
if (err.code === "ENOENT") {
console.error(`💪 Error: File '${path}' not found`);
console.error("💪 Make sure the file exists and try again");
} else {
console.error(err.message || err);
}
process.exit(1);
}
}
/* Exports for embedding/tests */
module.exports = { runProgram };