JSFiddle - React, Tailwind, and code Playground
by Josh Pullen
JavaScript
const x = { name: "x" }
const expression = {
type: "add",
args: [
{ type: "integer", value: 1 },
{
type: "power",
base: {
type: "add",
args: [
{ type: "variable", var: x },
{ type: "integer", value: 6 }
]
},
exponent: { type: "integer", value: 2 }
}
]
}
const expression2 = {
type: "vector",
values: [
{ type: "integer", value: 1 },
{ type: "integer", value: 2 },
{ type: "integer", value: 3 }
]
}
const expression3 = {
type: "point",
values: [
{ type: "integer", value: 0 },
{ type: "integer", value: 0 }
]
}
const circle = {
type: "circle",
center: {
type: "point",
values: [
{ type: "integer", value: 0 },
{ type: "integer", value: 0 }
]
},
radius: { type: "integer", value: 5 }
}
const line = {
type: "line",
points: [
{
type: "point",
values: [
{ type: "integer", value: 0 },
{ type: "integer", value: 1 }
]
},
{
type: "point",
values: [
{ type: "integer", value: 2 },
{ type: "integer", value: 2 }
]
}
]
}
const line2 = {
type: "line",
slope:
}
function stringify(node) {
switch (node.type) {
case "add":
return node.args.map(stringify).join(" + ")
case "power":
let baseStr = stringify(node.base)
let expStr = stringify(node.exponent)
if (pemdasPower(node.base) < pemdasPower(node)) {
baseStr = `(${baseStr})`
}
if (pemdasPower(node.exponent) < pemdasPower(node)) {
expStr = `(${expStr})`
}
return `${baseStr}^${expStr}`
case "integer":
return String(node.value)
case "variable":
return node.var.name
default:
return ""
}
}
function pemdasPower(node) {
return {
add: 1,
power: 2,
integer: 3,
variable: 3
}[node.type]
}
function evaluate(node, variableValues = new Map()) {
switch (node.type) {
case "add":
return node.args.map(node...