thanks, uberpolymorphism!

This commit is contained in:
Aidan K. Ewart 2020-05-31 02:52:02 +01:00
parent 678dc200b2
commit 56bfc23f98
4 changed files with 38 additions and 29 deletions

View File

@ -86,11 +86,13 @@ const cloneElem = (elem) => {
const lookupScope = (name, scope) => {
let n = scope[name];
console.log(n);
if (n) {
return cloneElem(n);
}
n = builtinDefn[name];
if (n) {
console.log(name, n);
return cloneElem(n);
} else {
throw 'var "' + name + '" not in scope'
@ -107,20 +109,24 @@ const giveArg = (closure, arg, scope) => {
}
const apply = (elem, stack) => {
if (elem.type === "closure") {
if (elem.func.nargs === 0) {
applyMany(elem.func.defn(stack.scope, []), stack);
} else if (stack.stack.length > 0) {
let out = giveArg(elem, stack.stack.pop(), stack.scope);
applyMany(out, stack);
if (Array.isArray(elem)) {
applyMany(elem, stack);
} else {
if (elem.type === "closure") {
if (elem.func.nargs === 0) {
apply(elem.func.defn(stack.scope, []), stack);
} else if (stack.stack.length > 0) {
let out = giveArg(elem, stack.stack.pop(), stack.scope);
apply(out, stack);
} else {
stack.stack.push(elem);
}
} else if (elem.type === "ident") {
let id = lookupScope(elem.val, stack.scope);
apply(id, stack);
} else {
stack.stack.push(elem);
}
} else if (elem.type === "ident") {
let id = lookupScope(elem.val, stack.scope);
apply(id, stack);
} else {
stack.stack.push(elem);
}
}
@ -140,7 +146,7 @@ const pushS = (elem, stack) => {
}
const defn = (elem, name, stack) => {
stack.scope[name] = makeObj(elem);
stack.scope[name] = execRPN(stack.scope, elem).stack;
}
const doStep = (ins, stack) => {

View File

@ -1,13 +1,12 @@
<html>
<style>
* {
background-color: #101020;
color: ghostwhite;
}
</style>
<h1>RPNCalc V4 Public Testing</h1>
<p>@ me (aidanprattewart@protonmail.com) if you have any errors, with console output please.</p>
<p>
Example Programs:
<br>
<code>(swap; a b -> a b) 1 2 swap</code> N.B. args are in reverse order
<br>
<code>1 + 2 (v partial -> 'v partial)</code> Evaluate a partial
</p>
<textarea type="text" id="inbox"></textarea>
<button id="submit">execute</button>
<p id="outbox"></p>

18
main.js
View File

@ -14,7 +14,7 @@ const show = (elem) => {
return "{" + show(elem.val.fst) + ", " + show(elem.val.snd) + "}"
} else if (elem.type === "closure") {
return "(args: {" + prettyprint(elem.args) + "} of " + elem.func.nargs + ")"
} else if (elem.type === "string") {
} else if (elem.type === "type") {
return elem.val
} else if (elem.type === "array") {
return "[" + prettyprint(elem.val) + "]"
@ -45,11 +45,15 @@ submit.onclick = (event) => {
return;
}
console.log(ast.parsed);
let out = execRPN({}, ast.parsed);
if (!out) {
outbox.innerHTML = "failed to execute";
return;
try {
let out = execRPN({}, ast.parsed);
if (!out) {
outbox.innerHTML = "failed to execute";
return;
}
console.log(out);
outbox.innerHTML = prettyprint(out.stack);
} catch (error) {
outbox.innerHTML = error;
}
console.log(out);
outbox.innerHTML = prettyprint(out.stack);
}

View File

@ -175,11 +175,11 @@ const parsePush = (stream) => {
const parseDefn = (stream) => {
let name = parseName(stream);
if (name.parsed === null) {
return {parsed:null, stream:name.stream};
throw 'no name found!'
}
let expr = parseExpr(stream);
let expr = parseExprs(stream);
if (expr.parsed === null) {
return {parsed:null, stream:expr.stream};
throw 'no body found!'
}
return {parsed:{type:"defn", ident:name.parsed, defn:expr.parsed}, stream:expr.stream}
}