lolcode-babel-macro
Version:
LOLCODE implementation with babel macros
1 lines • 10.5 kB
Source Map (JSON)
{"version":3,"file":"lolcode-babel-macro.mjs","sources":["../src/lolstdlib.js","../src/JSify.js","../src/macro.js","../src/index.js"],"sourcesContent":["/**\n * LOLCODE built in functions.\n */\nconst stdlib = {\n NOT: function(a) {\n return !a;\n },\n \"ANY OF\": function(var_args) {\n var args = lol.utils.argsArray(arguments);\n for (var i = 0; i < args.length; i++) {\n if (args[i]) {\n return true;\n }\n }\n return false;\n },\n \"BIGGR OF\": function(a, b) {\n return Math.max(a, b);\n },\n \"SMALLR OF\": function(a, b) {\n return Math.min(a, b);\n },\n \"SUM OF\": function(a, b) {\n return a + b;\n },\n \"DIFF OF\": function(a, b) {\n return a - b;\n },\n \"PRODUKT OF\": function(a, b) {\n return a * b;\n },\n \"QUOSHUNT OF\": function(a, b) {\n return a / b;\n },\n \"BOTH OF\": function(a, b) {\n return a && b;\n },\n \"EITHER OF\": function(a, b) {\n return a || b;\n },\n \"BOTH SAEM\": function(a, b) {\n return a === b;\n },\n SMOOSH: function(var_args) {\n var args = lol.utils.argsArray(arguments);\n return lol.utils.toYarn(\n args.reduce(function(a, b) {\n return lol.utils.toYarn(a) + lol.utils.toYarn(b);\n })\n );\n },\n \"BIGGR THAN\": function(a, b) {\n return a > b;\n },\n \"SMALLR THAN\": function(a, b) {\n return a < b;\n },\n \"MOD OF\": function(a, b) {\n return a % b;\n },\n \"LEN OF\": function(a) {\n return a && typeof a.length !== \"undefined\" ? a.length : null;\n },\n \"ORD OF\": function(a) {\n return a && a.charCodeAt ? a.charCodeAt(0) : -1;\n },\n \"CHR OF\": function(a) {\n return String.fromCharCode(a);\n }\n};\n\nexport default stdlib;\n","import stdlib from \"./lolstdlib\";\n\nclass JSify {\n Assignment = (node, newIT) => {\n return `${node.name} = ${this.compile(node.value)}`;\n };\n\n ArgList = (node, newIT) => {\n return node.values.map(this.compile).join(\", \");\n };\n\n Body = (node, newIT) => {\n node.lines = node.lines.map(node => this.compile(node));\n if (newIT) {\n node.lines.unshift(`let IT;`);\n }\n\n return node.lines.join(\"\\n\");\n };\n\n Break = (node, newIT) => {\n return \"break;\";\n };\n\n Declaration = (node, newIT) => {\n let value = \"null\";\n\n if (node.value !== null) {\n value = this.compile(node.value);\n }\n\n return `let ${node.name} = ${value};`;\n };\n\n FunctionCall = (node, newIT) => {\n if (stdlib[node.name]) {\n return `lolcode.stdlib[\"${node.name}\"](${this.compile(node.args)})`;\n } else {\n return `${node.name}(${this.compile(node.args)})`;\n }\n };\n\n FunctionDefinition = (node, newIT) => {\n return `function ${node.name}(${node.args.join(\", \").toLowerCase()}) {\n ${this.compile(node.body)}\n return IT;\n }`;\n };\n\n Return = (node, newIT) => {\n return `return ${this.compile(node.expression)}`;\n };\n\n Identifier = (node, newIT) => {\n return node.name.toLowerCase();\n };\n\n If = (node, newIT) => {\n let cond = node.condition;\n\n // MEBBEs have conditions\n // otherwise use implicit IT\n // implementation quirk: previous expression val must be assigned to IT\n if (cond) {\n cond = this.compile(node.condition);\n } else {\n cond = \"IT\";\n }\n\n let code = `if (${cond}) {\n ${this.compile(node.body)}\n }`;\n\n if (node.elseIfs) {\n code += node.elseIfs\n .map(node => `else ${this.compile(node)}`)\n .join(\"\\n\");\n }\n\n if (node.elseBody) {\n code += `else {\n ${this.compile(node.elseBody)}\n }`;\n }\n\n return code;\n };\n\n Gimmeh = (node, newIT) => {\n return `${node.variable} = window.prompt()`;\n };\n\n Visible = (node, newIT) => {\n return `console.log(${this.compile(node.expression)})`;\n };\n\n Literal = (node, newIT) => {\n if (typeof node.value === \"string\") {\n return `\"${node.value}\"`;\n } else {\n return node.value;\n }\n };\n\n Loop = (node, newIT) => {\n const cond = this.compile(node.condition);\n const op = node.op;\n const body = this.compile(node.body);\n\n const incordec = op.command == \"inc\" ? \"++\" : \"--\";\n return `for (; ${cond}; _${op.symbol}${incordec}) {\n ${body};\n };`;\n };\n\n LoopCondition = (node, newIT) => {\n if (!node) {\n return \"true\";\n } else {\n const expr = this.compile(node.expression);\n return node.check === \"while\" ? expr : `!${expr}`;\n }\n };\n\n NoOp = (node, newIT) => {\n return \"() => {}\";\n };\n\n Switch = (node, newIT) => {\n // LOLCODE switches operate on implicit IT variable\n // implementation quirk:\n // you have to explicitly assign to IT on previous line\n\n return `switch(IT) {\n ${node.branches.map(this.compile).join(\"\\n\")}\n };`;\n };\n\n Case = (node, newIT) => {\n return `case ${this.compile(node.condition)}:\n ${this.compile(node.body, false)}\n `;\n };\n\n CaseDefault = (node, newIT) => {\n return `default:\n ${this.compile(node.body, false)}\n `;\n };\n\n compile = (node, newIT = true) => {\n if (this[node._name]) {\n node = this[node._name](node, newIT);\n } else {\n throw new Error(`Not implemented: ${node._name}`);\n }\n\n return node;\n };\n}\n\nexport default JSify;\n","import { createMacro } from \"babel-plugin-macros\";\nimport { parser } from \"@swizec/loljs\";\n\nimport JSify from \"./JSify\";\nimport stdlib from \"./lolstdlib\";\n\nconst macro = createMacro(myMacro);\nmacro.stdlib = stdlib;\n\nexport default macro;\n\nfunction myMacro({ references, state, babel }) {\n references.lolcode.forEach(referencePath => {\n const compiled = compileLolcode(referencePath);\n\n referencePath.parentPath.replaceWithSourceString(compiled);\n });\n}\n\nfunction compileLolcode(referencePath) {\n const source = referencePath.parentPath.node.quasi.quasis\n .map(node => node.value.raw)\n .join(\"\");\n\n const ast = parser.parse(source);\n const jsify = new JSify();\n\n return `function () {\n ${jsify.compile(ast)} \n }`;\n}\n","import * as macro from './macro';\n\nexport default macro.default;"],"names":["const","stdlib","NOT","a","var_args","args","lol","utils","argsArray","arguments","i","length","b","Math","max","min","SMOOSH","toYarn","reduce","charCodeAt","String","fromCharCode","JSify","Assignment","node","newIT","this","compile","value","ArgList","values","map","join","Body","lines","unshift","Break","Declaration","FunctionCall","name","FunctionDefinition","toLowerCase","body","Return","expression","Identifier","If","cond","condition","code","elseIfs","elseBody","Gimmeh","Visible","Literal","Loop","op","command","LoopCondition","expr","check","NoOp","Switch","branches","Case","CaseDefault","_name","Error","macro","createMacro","ref","lolcode","forEach","referencePath","compiled","source","parentPath","quasi","quasis","raw","ast","parser","parse","compileLolcode","replaceWithSourceString"],"mappings":"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"}