diff --git a/tracer/builtin.mjs b/tracer/builtin.mjs index 0c5ca5a..c80db8f 100644 --- a/tracer/builtin.mjs +++ b/tracer/builtin.mjs @@ -81,6 +81,13 @@ const addDefn = (name, args, fn) => { } } +const addConst = (name, typ, val) => { + defnOp(name, [{type:typ, val:val}]) +} + +const unary = (fn, outty) => (args) => [{type:outty, val:fn(args[0])}] +const binary = (fn, outty) => (args) => [{type:outty, val:fn(args[0], args[1])}] + const add = (args) => [{type:"num", val:args[0] + args[1]}]; const sub = (args) => [{type:"num", val:args[0] - args[1]}]; const div = (args) => [{type:"num", val:args[0] / args[1]}]; @@ -103,11 +110,23 @@ const eq = (args) => { } } +const coerce = (args) => [{type:args[1].val, val:args[0].val}] + +addConst("pi", "num", Math.PI); +addConst("e", "num", Math.E); addDefn("+", ["num", "num"], add); addDefn("-", ["num", "num"], sub); addDefn("/", ["num", "num"], div); addDefn("*", ["num", "num"], mult); addDefn("^", ["num", "num"], pow); +addDefn("sin", ["num"], unary(Math.sin, "num")); +addDefn("cos", ["num"], unary(Math.cos, "num")); +addDefn("tan", ["num"], unary(Math.tan, "num")); +addDefn("asin", ["num"], unary(Math.asin, "num")); +addDefn("acos", ["num"], unary(Math.acos, "num")); +addDefn("atan", ["num"], unary(Math.atan, "num")); +addDefn("ln", ["num"], unary(Math.log, "num")); +addDefn("coerce", 2, coerce) addDefn("sqrt", ["num"], root); addDefn("==", 4, eq); addDefn("pair", 2, pair); diff --git a/tracer/main.js b/tracer/main.js index 57d2814..23556c6 100644 --- a/tracer/main.js +++ b/tracer/main.js @@ -98,11 +98,13 @@ stepb.onclick = _ => { if (!(pos.start === 0 && pos.end === 0)) { insbox.innerHTML = highlight(input, pos.start, pos.end, "green"); } + /* if (state.stacks.length > 1) { outbox.innerHTML = "... " + prettyprint(state.stacks[state.stacks.length-1]); } else { outbox.innerHTML = prettyprint(state.stacks[0]); - } + }*/ + outbox.innerHTML = state.stacks.map(prettyprint).join("\n") } }