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...