aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2020-12-17 13:09:15 -0500
committerMarshall Lochbaum <mwlochbaum@gmail.com>2020-12-17 13:11:27 -0500
commit0f6efafbf69a4eb8f2cea1037671fbf304c06ab8 (patch)
tree3413690b2253dc5141156dadde8d4611512e2e3e
parent9f3f0f9ffe71ff48e49999480306ca1e0c44ba4e (diff)
Factor out getv from get (which was missing an error check) and case 21
-rw-r--r--docs/bqn.js10
1 files changed, 5 insertions, 5 deletions
diff --git a/docs/bqn.js b/docs/bqn.js
index 27c98963..fa9456b0 100644
--- a/docs/bqn.js
+++ b/docs/bqn.js
@@ -10,7 +10,8 @@ let call = (f,x,w) => {
return f(x, w);
}
-let get = x => x.e ? x.e[x.p] : arr(x.map(c=>get(c)), x.sh);
+let getv= (a,i) => { let v=a[i]; if (v===null) throw Error("Runtime: Variable referenced before definition"); return v; }
+let get = x => x.e ? getv(x.e,x.p) : arr(x.map(c=>get(c)), x.sh);
let set = (d, id, v) => {
let eq = (a,b) => a.length===b.length && a.every((e,i)=>e===b[i]);
if (id.e) {
@@ -25,7 +26,6 @@ let set = (d, id, v) => {
}
let chkM = (v,m) => { if (m.m!==v) throw Error("Runtime: Only a "+v+"-modifier can be called as a "+v+"-modifier"); }
-let chkR = v => { if (v===null) throw Error("Runtime: Variable referenced before definition"); }
let genjs = (B, p, L) => { // Bytecode -> Javascript compiler
let rD = 0;
let r = L?"let l=0;try{":"";
@@ -53,7 +53,7 @@ let genjs = (B, p, L) => { // Bytecode -> Javascript compiler
case 13: { let i=rG(),f=rG(),x=rG(); r+=rP("set(0,"+i+",call("+f+","+x+",get("+i+")))"); break; }
case 14: { rD--; break; }
case 15: { r+= rP("D["+num()+"](e)"); break; }
- case 21: { r+= rP(ge(num())+"["+num()+"]")+"chkR("+rV(rD-1)+");"; break; }
+ case 21: { r+= rP("getv("+ge(num())+","+num()+")"); break; }
case 22: { r+= rP("{e:"+ge(num())+",p:"+num()+"}"); break; }
case 25: { if(rD!==1) throw Error("Internal compiler error: Wrong stack size"); r+= "return v0;"; break loop; }
}
@@ -74,8 +74,8 @@ let run = (B,O,S,L) => { // Bytecode, Objects, Sections/blocks
if (type===0) c = "let e2=def;"+c;
if (type===1) c = "const mod=(f ) => {let e2=[...def]; e2["+I+"]=mod;e2["+(I+1)+"]=f;" +c+"}; mod.m=1;return mod;";
if (type===2) c = "const mod=(f,g) => {let e2=[...def]; e2["+I+"]=mod;e2["+(I+1)+"]=f;e2["+(I+2)+"]=g;"+c+"}; mod.m=2;return mod;";
- return Function("'use strict'; return (chkM,chkR,has,call,get,set,list,train2,train3,O,L,def) => D => oe => {"+c+"};")()
- (chkM,chkR,has,call,get,set,list,train2,train3,O,L,def);
+ return Function("'use strict'; return (chkM,has,call,getv,get,set,list,train2,train3,O,L,def) => D => oe => {"+c+"};")()
+ (chkM,has,call,getv,get,set,list,train2,train3,O,L,def);
});
D.forEach((d,i) => {D[i]=d(D)});
return D[0]([]);