[pro-2-ur strick**20120326054530 Ignore-this: 4127ca7be62b024870f550b4f9be55cd ] hunk ./terse-a1/src/terse/a1/TerseActivity.java 31 -import terse.vm.Pro; -import terse.vm.Pro.Blk; -import terse.vm.Pro.Num; +import terse.vm.Ur; +import terse.vm.Ur.Blk; +import terse.vm.Ur.Num; hunk ./terse-a1/src/terse/a1/TerseActivity.java 36 -import terse.vm.Pro.Dict; -import terse.vm.Pro.Str; -import terse.vm.Pro.Vec; +import terse.vm.Ur.Dict; +import terse.vm.Ur.Str; +import terse.vm.Ur.Vec; hunk ./terse-a1/src/terse/a1/TerseActivity.java 327 - Pro value = d.dict.get(VALUE); - Pro title = d.dict.get(TITLE); + Ur value = d.dict.get(VALUE); + Ur title = d.dict.get(TITLE); hunk ./terse-a1/src/terse/a1/TerseActivity.java 338 - final ArrayList v = ((Vec) value).vec; + final ArrayList v = ((Vec) value).vec; hunk ./terse-a1/src/terse/a1/TerseActivity.java 341 - Pro item = v.get(i); + Ur item = v.get(i); hunk ./terse-a1/src/terse/a1/TerseActivity.java 557 - ArrayList list; + ArrayList list; hunk ./terse-a1/src/terse/a1/TerseActivity.java 560 - public DrawView(Context context, ArrayList list, Dict dict) { + public DrawView(Context context, ArrayList list, Dict dict) { hunk ./terse-a1/src/terse/a1/TerseActivity.java 582 - Pro p = list.get(i); + Ur p = list.get(i); hunk ./terse-a1/src/terse/a1/TerseActivity.java 657 - static String stringAt(Pro p, String i) { + static String stringAt(Ur p, String i) { hunk ./terse-a1/src/terse/a1/TerseActivity.java 661 - static String stringAt(Pro p, int i) { + static String stringAt(Ur p, int i) { hunk ./terse-a1/src/terse/a1/TerseActivity.java 665 - static float floatAt(Pro p, int i) { + static float floatAt(Ur p, int i) { hunk ./terse-vm/prelude.txt 120 + '|link|/HelloWeb|[HelloWeb]|'; hunk ./terse-vm/prelude.txt 138 + '|link|/HelloWeb|[HelloWeb]|', 'HelloWeb '; hunk ./terse-vm/prelude.txt 394 +class HelloWeb App +meth HelloWeb handle:query: + + DICT('type', 'html'; + 'title', 'HelloWeb Title'; + 'value', ' +
    +
  • Test. +
  • hello +
  • world +
  • Go Home + ' ap: + FOR(i:100)MAP( + VEC('
  • ', i) jam + ) implode + ) + hunk ./terse-vm/src/terse/vm/Async.java 11 -import terse.vm.Pro.Dict; -import terse.vm.Pro.Vec; +import terse.vm.Ur.Dict; +import terse.vm.Ur.Vec; hunk ./terse-vm/src/terse/vm/Cls.java 8 -import terse.vm.Pro.Obj; +import terse.vm.Ur.Obj; hunk ./terse-vm/src/terse/vm/Cls.java 28 - HashMap insts; + HashMap insts; hunk ./terse-vm/src/terse/vm/Cls.java 40 - this.insts = new HashMap(); + this.insts = new HashMap(); hunk ./terse-vm/src/terse/vm/Cls.java 44 - Pro existing = terp.clss.get(name); + Ur existing = terp.clss.get(name); hunk ./terse-vm/src/terse/vm/Cls.java 90 - Pro p = terp.clss.get(s.toLowerCase()); + Ur p = terp.clss.get(s.toLowerCase()); hunk ./terse-vm/src/terse/vm/Cls.java 221 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 224 - Pro z = num == null ? terp.instNil : self.insts.get(num.num); + Ur z = num == null ? terp.instNil : self.insts.get(num.num); hunk ./terse-vm/src/terse/vm/Cls.java 230 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 238 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 246 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 258 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 270 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 281 -// public Pro apply(Frame f, Pro r, Pro[] args) { +// public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 329 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 358 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 366 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 368 - Pro[] arr = new Pro[terp.clss.size()]; + Ur[] arr = new Ur[terp.clss.size()]; hunk ./terse-vm/src/terse/vm/Cls.java 371 - Pro key = terp.newStr(k); - Pro value = terp.clss.get(k); + Ur key = terp.newStr(k); + Ur value = terp.clss.get(k); hunk ./terse-vm/src/terse/vm/Cls.java 410 - public abstract Pro apply(Frame f, Pro r, Pro[] args); + public abstract Ur apply(Frame f, Ur r, Ur[] args); hunk ./terse-vm/src/terse/vm/Cls.java 428 - public abstract Pro apply(Frame f, Pro r, Pro[] args); + public abstract Ur apply(Frame f, Ur r, Ur[] args); hunk ./terse-vm/src/terse/vm/Cls.java 441 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 446 - public abstract Pro apply1(Frame f, Pro r, Str a); + public abstract Ur apply1(Frame f, Ur r, Str a); hunk ./terse-vm/src/terse/vm/Cls.java 468 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Cls.java 477 - Pro z = top.eval(f2); + Ur z = top.eval(f2); hunk ./terse-vm/src/terse/vm/Expr.java 6 -import terse.vm.Pro.Obj; +import terse.vm.Ur.Obj; hunk ./terse-vm/src/terse/vm/Expr.java 24 - public abstract Pro eval(Frame f); + public abstract Ur eval(Frame f); hunk ./terse-vm/src/terse/vm/Expr.java 79 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 84 - public abstract void store(Frame f, Pro x); + public abstract void store(Frame f, Ur x); hunk ./terse-vm/src/terse/vm/Expr.java 86 - public abstract Pro recall(Frame f); + public abstract Ur recall(Frame f); hunk ./terse-vm/src/terse/vm/Expr.java 124 - public void store(Frame f, Pro x) { + public void store(Frame f, Ur x) { hunk ./terse-vm/src/terse/vm/Expr.java 129 - public Pro recall(Frame f) { + public Ur recall(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 155 - public void store(Frame f, Pro x) { + public void store(Frame f, Ur x) { hunk ./terse-vm/src/terse/vm/Expr.java 160 - public Pro recall(Frame f) { + public Ur recall(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 178 - // =get LvTuple Pro[] arr arr - public Pro[] arr; + // =get LvTuple Ur[] arr arr + public Ur[] arr; hunk ./terse-vm/src/terse/vm/Expr.java 181 - public LvTuple(Cls cls, Pro[] arr) { + public LvTuple(Cls cls, Ur[] arr) { hunk ./terse-vm/src/terse/vm/Expr.java 185 - public LvTuple(Terp terp, Pro[] arr) { + public LvTuple(Terp terp, Ur[] arr) { hunk ./terse-vm/src/terse/vm/Expr.java 193 - for (Pro e : arr) { + for (Ur e : arr) { hunk ./terse-vm/src/terse/vm/Expr.java 200 - public void store(Frame f, Pro x) { + public void store(Frame f, Ur x) { hunk ./terse-vm/src/terse/vm/Expr.java 218 - public Pro recall(Frame f) { - Pro[] zz = new Pro[arr.length]; + public Ur recall(Frame f) { + Ur[] zz = new Ur[arr.length]; hunk ./terse-vm/src/terse/vm/Expr.java 228 - for (Pro x : arr) { + for (Ur x : arr) { hunk ./terse-vm/src/terse/vm/Expr.java 243 - public LvList(Terp terp, Pro[] arr) { + public LvList(Terp terp, Ur[] arr) { hunk ./terse-vm/src/terse/vm/Expr.java 251 - for (Pro e : arr) { + for (Ur e : arr) { hunk ./terse-vm/src/terse/vm/Expr.java 298 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 336 - public Pro eval(Frame f) { - Pro x = expr.eval(f); + public Ur eval(Frame f) { + Ur x = expr.eval(f); hunk ./terse-vm/src/terse/vm/Expr.java 363 - public Pro eval(Frame f) { - Pro x = expr.eval(f); + public Ur eval(Frame f) { + Ur x = expr.eval(f); hunk ./terse-vm/src/terse/vm/Expr.java 390 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 410 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 429 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 444 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 462 - public Pro eval(Frame f) { - Pro z = f.terp().clss.get(key); + public Ur eval(Frame f) { + Ur z = f.terp().clss.get(key); hunk ./terse-vm/src/terse/vm/Expr.java 488 - public Pro eval(Frame f) { - Pro value = expr.eval(f); + public Ur eval(Frame f) { + Ur value = expr.eval(f); hunk ./terse-vm/src/terse/vm/Expr.java 523 - static boolean understands(Pro r, String msg) { + static boolean understands(Ur r, String msg) { hunk ./terse-vm/src/terse/vm/Expr.java 528 - public static Meth findMeth(Pro r, String msg, boolean gripe) { + public static Meth findMeth(Ur r, String msg, boolean gripe) { hunk ./terse-vm/src/terse/vm/Expr.java 565 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 569 - Pro r = rcvr.eval(f); + Ur r = rcvr.eval(f); hunk ./terse-vm/src/terse/vm/Expr.java 571 - Pro a[] = new Pro[args.length]; + Ur a[] = new Ur[args.length]; hunk ./terse-vm/src/terse/vm/Expr.java 600 - Pro z = null; + Ur z = null; hunk ./terse-vm/src/terse/vm/Expr.java 714 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 772 - public Pro eval(Frame f) { - Pro z = f.terp().instNil; + public Ur eval(Frame f) { + Ur z = f.terp().instNil; hunk ./terse-vm/src/terse/vm/Expr.java 836 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 840 - Pro x = expr.eval(f); + Ur x = expr.eval(f); hunk ./terse-vm/src/terse/vm/Expr.java 896 - Pro value; // Literal value. + Ur value; // Literal value. hunk ./terse-vm/src/terse/vm/Expr.java 898 - public Lit(Pro value) { + public Lit(Ur value) { hunk ./terse-vm/src/terse/vm/Expr.java 903 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/Expr.java 923 - public Pro eval(Frame f) { + public Ur eval(Frame f) { hunk ./terse-vm/src/terse/vm/ExprTest.java 18 - protected Pro eval(Expr.Top top) { + protected Ur eval(Expr.Top top) { hunk ./terse-vm/src/terse/vm/ExprTest.java 26 - Pro obj = eval(top); + Ur obj = eval(top); hunk ./terse-vm/src/terse/vm/ExprTest.java 31 - Pro obj = eval(top); + Ur obj = eval(top); hunk ./terse-vm/src/terse/vm/Makefile 4 -J = Pro.java Terp.java Expr.java Cls.java Parser.java +J = Ur.java Terp.java Expr.java Cls.java Parser.java hunk ./terse-vm/src/terse/vm/Parser.java 9 -import terse.vm.Pro.Obj; +import terse.vm.Ur.Obj; hunk ./terse-vm/src/terse/vm/Parser.java 397 - z = new Expr.Lit(new Pro.Num(terp, Double.parseDouble(lex.w))); + z = new Expr.Lit(new Ur.Num(terp, Double.parseDouble(lex.w))); hunk ./terse-vm/src/terse/vm/Parser.java 400 - z = new Expr.Lit(new Pro.Str(terp, lex.w)); + z = new Expr.Lit(new Ur.Str(terp, lex.w)); hunk ./terse-vm/src/terse/vm/Pro.java 1 -package terse.vm; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintStream; -import java.util.Arrays; -import java.util.HashMap; -import java.util.ArrayList; -import java.util.regex.Pattern; - -import terse.vm.Cls.JavaMeth; -import terse.vm.Cls.StrMeth; -import terse.vm.Expr.Seq; -import terse.vm.Terp.Frame; - -@SuppressWarnings("rawtypes") -public class Pro extends Static implements Comparable { - // =get Pro . cls cls - public Cls cls; - // =get Pro Pro[] instVars peekInstVars - Pro[] instVars; - - // =cls "Sys" Pro - public Pro(Cls cls) { - this.cls = cls; - if (cls == null) { // null cls happens during bootup. - this.instVars = emptyPros; - if (!Terp.tolerateNullClass) { - breakHere(this); - assert Terp.tolerateNullClass; - } - } else { - ++cls.countInstances; - final int allVarsSize = cls.allVars.size(); - if (allVarsSize == 0) { - this.instVars = emptyPros; - } else { - this.instVars = new Pro[allVarsSize]; - for (int i = 0; i < allVarsSize; i++) { - this.instVars[i] = cls.terp.instNil; - } - } - } - } - - public String repr() { - return toString(); - } - - public String toString() { - return fmt("%s~%s", cls.name, hashCode()); - } - - public void visit(Visitor v) { - v.visitPro(this); - } - - public final Terp terp() { - return cls.terp; - } - - public final void say(String msg, Object... objects) { - cls.terp.say(msg, objects); - } - - public final Pro toss(String msg, Object... objects) { - return cls.terp.toss(msg, objects); - } - - public Obj asObj() { - return null; - } - - public Num asNum() { - return null; - } - - public Str asStr() { - return null; - } - - public Cls asCls() { - return null; - } - - public Blk asBlk() { - return null; - } - - public Undefined asNil() { - return null; - } - - public Usr asUsr() { - return null; - } - - public Vec asVec() { - return null; - } - - public Dict asDict() { - return null; - } - - public final Str mustStr() { - try { - return (Str) this; - } catch (Exception ex) { - return (Str) toss("Should have been a Str, but wasn't: <%s#%s>", - this.cls, this); - } - } - - public final Num mustNum() { - try { - return (Num) this; - } catch (Exception ex) { - return (Num) toss("Should have been a Num, but wasn't: <%s#%s>", - this.cls, this); - } - } - - public final Vec mustVec() { - try { - return (Vec) this; - } catch (Exception ex) { - return (Vec) toss("Should have been a Vec, but wasn't: <%s#%s>", - this.cls, this); - } - } - - public final Vec mustPair() { - try { - Vec z = (Vec) this; - if (z.vec.size() != 2) { - toss("Should have been a Vec of length 2, but was length %d: <%s>", - z.vec.size(), z); - } - return z; - } catch (Exception ex) { - return (Vec) toss("Should have been a Vec, but wasn't: <%s#%s>", - this.cls, this); - } - } - - public final Dict mustDict() { - try { - return (Dict) this; - } catch (Exception ex) { - return (Dict) toss("Should have been a Dict, but wasn't: <%s#%s>", - this.cls, this); - } - } - - // TODO: Some of the following should be down at Obj. - // Pro should toss subclassResponsibility for anything it can. - // No one will care, until somebody uses Pro. - - // Most objects are true. - // nil and Nums that round to 0 are false. - public boolean truth() { - // say("Object <%s> class %s is TRUE in Obj::truth.", this, cls.name); - return true; - } - - public Pro boolObj(boolean x) { - return x ? terp().instTrue : terp().instFalse; - } - - Comparable innerValue() { - return null; - } - - public int hashCode() { - Object innerThis = this.innerValue(); - if (innerThis == null) { - // Avoid infinite recursion. - return System.identityHashCode(this); - } else { - return innerValue().hashCode(); - } - } - - public boolean equals(Object obj) { - if (obj instanceof Pro) { - Pro that = (Pro) obj; - if (this.cls != that.cls) { - return false; - } - Object innerThis = this.innerValue(); - Object innerThat = that.innerValue(); - if (innerThis != null && innerThat != null) { - // Both inner objects exist; compare them. - boolean z = innerThis.equals(innerThat); - return z; - } else { - // Avoid infinite recursion. - boolean z = this == that; - return z; - } - } else { - return false; - } - } - - public int compareTo(Object obj) { - // say("CMP <%s> <%s>", this, obj); - if (obj instanceof Pro) { - Pro that = (Pro) obj; - if (this.cls != that.cls) { - // say("CMP cls.name <%s> <%s>", this.cls.name, that.cls.name); - return this.cls.name.compareTo(that.cls.name); - } - Object innerThis = this.innerValue(); - Object innerThat = that.innerValue(); - if (innerThis != null && innerThat != null) { - // Not Equal because innerObject returned Value-like objects. - // say("CMP inner <%s> <%s>", innerThis, innerThat); - return ((Comparable) innerThis).compareTo(innerThat); - } - } - // say("CMP identityHashCode <%s> <%s>", System.identityHashCode(this), - // System.identityHashCode(obj)); - return new Integer(System.identityHashCode(this)) - .compareTo(new Integer(System.identityHashCode(obj))); - } - - // =meth Obj nearestInt - // "convert a Num to the nearest int, by adding 0.5 and flooring" - public int toNearestInt() { - Num num = this.asNum(); - if (num == null) { - toss("Object is a %s, not a Num", this.cls.name); - } - int i = (int) Math.floor(num.num + 0.5); // closest int - return i; - } - - static void addBuiltinMethodsForPro(Terp terp) { - // terp.tPro.addMethod(new JavaMeth(terp.tPro, "class", "cls") { - // @Override - // public Pro apply(Frame f, Pro r, Pro[] args) { - // // say(" r=%s r.cls=%s r.cls.name=%s r.cls.name=%s", - // // r, - // // r.cls, r.cls.name, r.cls.name); - // return r.cls; - // } - // }); - } - - /** Special marker object, for message to super. */ - public static class Super extends Pro { - // =cls "Sys" Super Pro - Super(Terp terp) { - super(terp.tSuper); - } - - public String toString() { - return "super "; - } - } - - // =cls "Sys" Obj Pro - public static class Obj extends Pro { - public Obj(Cls cls) { - super(cls); - } - - public Obj asObj() { - return this; - } - - public static Vec evalMacroBlockMakingVec(Blk b) { - Pro[] arr; - if (b.body instanceof Expr.MakeVec) { - Expr.MakeVec mv = (Expr.MakeVec) b.body; - final int n = mv.elements.length; - arr = new Pro[n]; - for (int i = 0; i < n; i++) { - // Eval in blk's frame! - Pro x = mv.elements[i].eval(b.f); - arr[i] = x; - } - } else if (b.body instanceof Expr.EmptyExprList) { - arr = emptyPros; - } else { - // Anything else is a singleton. - Pro x = b.evalWithoutArgs(); - arr = pros(x); - } - return new Vec(b.terp(), arr); - } - - // =meth Obj "macro" macro:vec: "Execute the block to return a vector." - public Pro macroVec(Frame _, Blk b) { - return evalMacroBlockMakingVec(b); - } - - // =meth Obj "macro" macro:dict: "Construct a Dict from list of pairs." - public Pro macroDict(Frame _, Blk b) { - Vec list = evalMacroBlockMakingVec(b); - Dict z = new Dict(b.terp()); - int sz = list.vec.size(); - for (int i = 0; i < sz; i++) { - Vec tuple = list.vec.get(i).mustVec(); - assert tuple.vec.size() == 2 : tuple; - z.dict.put(tuple.vec.get(0), tuple.vec.get(1)); - } - return z; - } - - // =meth Obj "macro" macro:for:do: - public Pro macroForDo(Frame _, Blk b, Blk c) { - Pro coll = b.evalWithoutArgs(); - Num num = coll.asNum(); - if (num != null) { - final int n = num.toNearestInt(); - for (int i = 0; i < n; i++) { - Num ii = terp().newNum(i); - b.storeAtParamKV(ii, ii); - c.evalWithoutArgs(); - } - return terp().instNil; - } - Vec vec = coll.asVec(); - if (vec != null) { - final int n = vec.vec.size(); - for (int i = 0; i < n; i++) { - Num ii = terp().newNum(i); - b.storeAtParamKV(ii, vec.vec.get(i)); - c.evalWithoutArgs(); - } - return terp().instNil; - } - Dict dict = coll.asDict(); - if (dict != null) { - Vec[] assocs = dict.sortedAssocs(); - final int n = assocs.length; - for (int i = 0; i < n; i++) { - b.storeAtParamKV(assocs[i].vec.get(0), assocs[i].vec.get(1)); - c.evalWithoutArgs(); - } - return terp().instNil; - } - return toss("For needs a Num, Vec, or Dict, but got <%s>", coll); - } - - // =meth Obj "macro" macro:for:map: - public Pro macroForMap(Frame _, Blk b, Blk c) { - Pro coll = b.evalWithoutArgs(); - Num num = coll.asNum(); - if (num != null) { - final int n = num.toNearestInt(); - Pro[] zz = new Pro[n]; - for (int i = 0; i < n; i++) { - Num ii = terp().newNum(i); - b.storeAtParamKV(ii, ii); - zz[i] = c.evalWithoutArgs(); - } - return new Vec(terp(), zz); - } - Vec vec = coll.asVec(); - if (vec != null) { - final int n = vec.vec.size(); - Pro[] zz = new Pro[n]; - for (int i = 0; i < n; i++) { - Num ii = terp().newNum(i); - b.storeAtParamKV(ii, vec.vec.get(i)); - zz[i] = c.evalWithoutArgs(); - } - return new Vec(terp(), zz); - } - Dict dict = coll.asDict(); - if (dict != null) { - Vec[] assocs = dict.sortedAssocs(); - final int n = assocs.length; - Dict z = new Dict(terp()); - for (int i = 0; i < n; i++) { - b.storeAtParamKV(assocs[i].vec.get(0), assocs[i].vec.get(1)); - z.dict.put(assocs[i].vec.get(0), c.evalWithoutArgs()); - } - return z; - } - return toss("For needs a Num, Vec, or Dict, but got <%s>", coll); - } - - // =meth Obj "macro" macro:for:init:reduce: - public Pro macroForMap(Frame _, Blk b, Blk init, Blk c) { - Pro coll = b.evalWithoutArgs(); - Pro state = init.evalWithoutArgs(); - Num num = coll.asNum(); - if (num != null) { - final int n = num.toNearestInt(); - for (int i = 0; i < n; i++) { - Num ii = terp().newNum(i); - b.storeAtParamKV(ii, ii); - init.storeAtParam0(state); - state = c.evalWithoutArgs(); - } - return state; - } - Vec vec = coll.asVec(); - if (vec != null) { - final int n = vec.vec.size(); - for (int i = 0; i < n; i++) { - Num ii = terp().newNum(i); - b.storeAtParamKV(ii, vec.vec.get(i)); - init.storeAtParam0(state); - state = c.evalWithoutArgs(); - } - return state; - } - Dict dict = coll.asDict(); - if (dict != null) { - Vec[] assocs = dict.sortedAssocs(); - final int n = assocs.length; - for (int i = 0; i < n; i++) { - b.storeAtParamKV(assocs[i].vec.get(0), assocs[i].vec.get(1)); - init.storeAtParam0(state); - state = c.evalWithoutArgs(); - } - return state; - } - return toss("For needs a Num, Vec, or Dict, but got <%s>", coll); - } - - // =meth Obj "macro" macro:if:then: - public Pro macroIfThenElse(Frame _, Blk b, Blk c) { - if (b.evalWithoutArgs().truth()) { - return c.evalWithoutArgs(); - } else { - return terp().instNil; - } - } - - // =meth Obj "macro" macro:if:then:else: - public Pro macroIfThenElse(Frame _, Blk b, Blk c, Blk d) { - if (b.evalWithoutArgs().truth()) { - return c.evalWithoutArgs(); - } else { - return d.evalWithoutArgs(); - } - } - - // =meth Obj "macro" macro:if:then:elif:then:else: - public Pro macroIfThenElse(Frame _, Blk b, Blk c, Blk d, Blk e, Blk f) { - if (b.evalWithoutArgs().truth()) { - return c.evalWithoutArgs(); - } else if (d.evalWithoutArgs().truth()) { - return e.evalWithoutArgs(); - } else { - return f.evalWithoutArgs(); - } - } - - // =meth Obj "macro" macro:if:then:elif:then: - public Pro macroIfThenElse(Frame _, Blk b, Blk c, Blk d, Blk e) { - if (b.evalWithoutArgs().truth()) { - return c.evalWithoutArgs(); - } else if (d.evalWithoutArgs().truth()) { - return e.evalWithoutArgs(); - } else { - return terp().instNil; - } - } - - // =meth Obj "macro" macro:and: - public Pro macroAnd(Frame _, Blk b) { - if (b.body instanceof Expr.MakeVec) { - Expr.MakeVec mv = (Expr.MakeVec) b.body; - for (int i = 0; i < mv.elements.length; i++) { - // Eval in blk's frame! - Pro x = mv.elements[i].eval(b.f); - // If any evals false, return false. - if (!x.truth()) { - return terp().instFalse; - } - } - return terp().instTrue; // All were true. - } else { - return terp().toss( - "Body of AND macro is not a vector constructor: <%s>", - b.body); - } - } - - // =meth Obj "macro" macro:or: - public Pro macroOr(Frame _, Blk b) { - if (b.body instanceof Expr.MakeVec) { - Expr.MakeVec mv = (Expr.MakeVec) b.body; - for (int i = 0; i < mv.elements.length; i++) { - // Eval in blk's frame! - Pro x = mv.elements[i].eval(b.f); - // If any evals true, return true. - if (x.truth()) { - return terp().instTrue; - } - } - return terp().instFalse; // All were false. - } else { - return terp().toss( - "Body of AND macro is not a vector constructor: <%s>", - b.body); - } - } - - // =meth Obj "eval" eval: "Evaluate a string as code in this receiver." - public Pro eval(String code) { - Expr.Top top = Parser.parseMethod(cls, "__eval__", code); - - // DEBUG - top.dump("EVAL/TOP "); - - Pro z = top.eval(cls.terp.newFrame(null, this, top)); - assert z != null : fmt("Null result in %s.eval <%s>", this, code); - return z; - } - - // =meth Obj "eval" eval:arg: - // "Evaluate a string as code in this receiver." - public Pro eval(String code, Pro a) { - // say("EVAL <%s> <<< <%s> <%s>", this, code, a); - Expr.Top top = Parser.parseMethod(cls, "__eval__:", code); - Frame f = cls.terp.newFrame(null, this, top); - f.locals[0] = a; - Pro z = top.eval(f); - assert z != null : fmt("Null result in %s.eval <%s>", this, code); - // say("EVAL <%s> >>> <%s>", this, z); - return z; - } - - // =meth Obj "eval" eval:arg:arg: - // "Evaluate a string as code in this receiver." - public Pro eval(String code, Pro a, Pro b) { - // say("EVAL <%s> <<< <%s> <%s> <%s>", this, code, a, b); - Expr.Top top = Parser.parseMethod(cls, "__eval__:__eval__:", code); - Frame f = cls.terp.newFrame(null, this, top); - f.locals[0] = a; - f.locals[1] = b; - Pro z = top.eval(f); - assert z != null : fmt("Null result in %s.eval <%s>", this, code); - // say("EVAL <%s> >>> <%s>", this, z); - return z; - } - - static void addBuiltinMethodsForObj(final Terp terp) { - new JavaMeth(terp.tObj, "must", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - if (!r.truth()) { - toss("MUST be True, but isn't: %s", r); - } - return r; - } - }; - new JavaMeth(terp.tObj, "must:", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - if (!r.truth()) { - String why; - if (args[0] instanceof Blk) { - why = ((Blk) args[0]).evalWithoutArgs().toString(); - } else { - why = args[0].toString(); - } - toss("MUST be True, but isn't: <%s> <%s>", r, why); - } - return r; - } - }; - new JavaMeth(terp.tObj, "cant:", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - if (r.truth()) { - String why; - if (args[0] instanceof Blk) { - why = ((Blk) args[0]).evalWithoutArgs().toString(); - } else { - why = args[0].toString(); - } - toss("CANT be True, but is: <%s> <%s>", r, why); - } - return r; - } - }; - new JavaMeth(terp.tObj, "err:", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - toss("ERROR: <%s>; <%s>", r, args[0]); - return r; - } - }; - new JavaMeth(terp.tObj, "err", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - toss("ERROR: <%s>", r); - return r; - } - }; - new JavaMeth(terp.tObj, "say", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - say("#SAY# <%s>", r); - return r; - } - }; - new JavaMeth(terp.tObj, "say:", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - say("#SAY# <%s>; <%s>", r, args[0]); - return r; - } - }; - new JavaMeth(terp.tObj, "hash", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return terp.newNum(r.hashCode()); - } - }; - new JavaMeth(terp.tObj, "sysHash", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return terp.newNum(System.identityHashCode(r)); - } - }; - new JavaMeth(terp.tObj, "not", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return boolObj(!r.truth()); - } - }; - new JavaMeth(terp.tObj, "ifNil:", "ifn:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - if (r.asNil() != null) { - Blk blk = args[0].asBlk(); - return blk.body.eval(f); - } else { - return terp.instNil; - } - } - }; - new JavaMeth(terp.tObj, "ifNotNil:", "ifnn:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - if (r.asNil() == null) { - Blk blk = args[0].asBlk(); - return blk.body.eval(f); - } else { - return terp.instNil; - } - } - }; - new JavaMeth(terp.tObj, "ifNil:ifNotNil:", "ifn:ifnn:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Blk blk = args[r.asNil() == null ? 1 : 0].asBlk(); - say("ifNil:ifNotNil: --> Choosing block %d: %s", - r.asNil() == null ? 1 : 0, blk); - return blk.body.eval(f); - } - }; - new JavaMeth(terp.tObj, "ifNotNil:ifNil:", "ifnn:ifn:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Blk blk = args[r.asNil() == null ? 0 : 1].asBlk(); - say("ifNotNil:ifNil: --> Choosing block %d: %s", - r.asNil() == null ? 0 : 1, blk); - return blk.body.eval(f); - } - }; - new JavaMeth(terp.tObj, "ifYes:", "y:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - if (r.truth()) { - Blk blk = args[0].asBlk(); - return blk.evalWithoutArgs(); - } else { - return terp.instNil; - } - } - }; - new JavaMeth(terp.tObj, "ifNo:", "n:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - if (r.truth()) { - return terp.instNil; - } else { - Blk blk = args[0].asBlk(); - return blk.evalWithoutArgs(); - } - } - }; - new JavaMeth(terp.tObj, "ifYes:ifNo:", "y:n:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Blk blk = args[r.truth() ? 0 : 1].asBlk(); - return blk.body.eval(f); - } - }; - new JavaMeth(terp.tObj, "ifNo:ifYes:", "n:y:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Blk blk = args[r.truth() ? 1 : 0].asBlk(); - return blk.body.eval(f); - } - }; - new JavaMeth(terp.tObj, "repr", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 0; - return terp.newStr(r.repr()); - } - }; - new JavaMeth(terp.tObj, "str", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 0; - return terp.newStr(r.toString()); - } - }; - new JavaMeth(terp.tObj, "eval:", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Str code = args[0].asStr(); - if (code == null) { - say("Expected a Str arg to eval: but got this instead: <%s: %s>", - args[0].cls, args[0]); - } - - say("EVAL <- %s eval: %s", r, code); - Pro z = r.asObj().eval(code.str); - say("EVAL -> %s", z); - // say("EVAL -> %s", z); - return z; - } - }; - new JavaMeth(terp.tObj, "instOf:", "isa:") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Cls query = args[0].asCls(); - if (query == null) { - toss("isInstOf: expected a Cls as it arg"); - } - for (Cls p = r.cls; p != null; p = query.supercls) { - if (p == query) { - return terp.instTrue; - } - } - return terp.instFalse; - } - }; - new JavaMeth(terp.tObj, "equals:", "") { - public Obj apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - return r.equals(args[0]) ? terp.instTrue : terp.instFalse; - } - }; - new JavaMeth(terp.tObj, "isSameAs:", "is:") { - public Obj apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - return r == args[0] ? terp.instTrue : terp.instFalse; - } - }; - } - } - - // =cls "Sys" Sys Obj - public final static class Sys extends Obj { - public Sys(Terp terp) { - super(terp.tSys); - } - - // =meth SysCls "io" files - // "Return list of tuples: names, mtime, length." - public static Vec files(Terp terp) { - Vec z = new Vec(terp); - File theDir = terp.getFilesDir(); - String[] names = theDir.list(); - for (int i = 0; i < names.length; i++) { - File theFile = new File(theDir, names[i]); - String name = names[i]; - if (name.endsWith(".txt")) { - z.vec.add(new Vec(terp, pros(terp.newStr(name), - terp.newNum(theFile.lastModified() / 1000), - terp.newNum(theFile.length())))); - } - } - return z; - } - - // =meth SysCls "io" read: "Read a text file as one big Str." - public static Pro readTxt(Terp terp, String filename) { - terp.checkTxtFileNameSyntax(filename); - StringBuilder sb = new StringBuilder(); - try { - FileInputStream fis = terp.openFileRead(filename); - InputStreamReader isr = new InputStreamReader(fis); - BufferedReader br = new BufferedReader(isr); - while (true) { - String line = br.readLine(); - if (line == null) - break; - sb.append(line); - sb.append('\n'); - } - fis.close(); - return terp.newStr(sb.toString()); - } catch (IOException e) { - return terp.toss("Cannot readTxt: <%s>: %s", filename, e); - } - } - - public static void writeOrAppendTxt(Terp terp, String filename, - String content, boolean append) { - terp.checkTxtFileNameSyntax(filename); - StringBuilder sb = new StringBuilder(); - try { - FileOutputStream fos = append ? terp.openFileAppend(filename) - : terp.openFileWrite(filename); - PrintStream ps = new PrintStream(fos); - ps.print(content); - } catch (IOException e) { - terp.toss("Cannot writeTxt: <%s>: %s", filename, e); - } - } - - // =meth SysCls "io" write:value: "Write a text file as one big Str." - public static void writeTxt(Terp terp, String filename, String content) { - writeOrAppendTxt(terp, filename, content, false); - } - - // =meth SysCls "io" append:value: - // "Append a text file as one big Str." - public static void appendTxt(Terp terp, String filename, String content) { - writeOrAppendTxt(terp, filename, content, true); - } - - // =meth SysCls "io" webFiles "List files on web with mtime and size." - public static Vec webListFiles(Terp terp) { - return terp.listOfWebFiles(); - } - - // =meth SysCls "io" pull: "Pull a file from the Web." - public static String pull(Terp terp, String filename) { - return terp.pullFromWeb(filename); - } - - // =meth SysCls "io" push:value: "Push a file to the Web." - public static void push(Terp terp, String filename, String content) { - terp.pushToWeb(filename, content); - } - - // =meth SysCls "sys" worldName "which world is loaded" - public static String _worldName(Terp terp) { - return terp.worldName; - } - - // =meth SysCls "sys" worldFileName "which world is loaded" - public static String _worldFileName(Terp terp) { - return terp.worldFilename; - } - - // =meth SysCls "sys" trigraphs "keyboard character substitution dict" - public static Pro trigraphs(Terp terp) { - Dict d = new Dict(terp); - for (int i = 0; i < Parser.TRIGRAPH_DATA.length; i += 2) { - d.dict.put(terp.newStr("/" + Parser.TRIGRAPH_DATA[i]), - terp.newStr(Parser.TRIGRAPH_DATA[i + 1])); - } - return d; - } - - } - - // =cls "Sys" Bogus Sys slot1,slot2,slot3 - - public final static class Undefined extends Obj { // Nil - // =cls "Data" Undefined Obj - public Undefined(Cls cls) { - super(cls); - } - - @Override - public Undefined asNil() { - return this; - } - - @Override - public String toString() { - return "Nil"; - } - - @Override - public void visit(Visitor v) { - v.visitUndefined(this); - } - - // Most objects are true. - // nil and Nums that round to 0 are false. - @Override - public boolean truth() { - return false; - } - - static void addBuiltinMethodsForFal(final Terp terp) { - new JavaMeth(terp.wrap.clsSys, "frame", "", - "Return current stack frame.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return f; - } - }; - } - } - - public final static class Blk extends Obj { - ;;;;; - Expr.Block block; - Expr body; - Expr[] params; - Frame f; - - // =cls "Data" Blk Obj - public Blk(Expr.Block block, Frame f) { - super(f.terp().tBlk); - this.block = block; - this.body = block.body; - this.params = block.params; - this.f = f; - } - - public Blk asBlk() { - return this; - } - - public String toString() { - return block.toString(); - } - - // =meth Blk "param" storeAtParam0: - public void storeAtParam0(Pro x) { - if (params.length > 0) { - ((Expr.LValue) params[0]).store(f, x); - } - } - - // =meth Blk "param" storeAtParam1: - public void storeAtParam1(Pro x) { - if (params.length > 1) { - ((Expr.LValue) params[1]).store(f, x); - } - } - - // =meth Blk "param" storeAtParamKV: - public void storeAtParamKV(Pro k, Pro v) { - if (params.length == 1) { - ((Expr.LValue) params[0]).store(f, v); - } else if (params.length > 1) { - ((Expr.LValue) params[0]).store(f, k); - ((Expr.LValue) params[1]).store(f, v); - } - } - - // =meth Blk "eval" value - public Pro evalWithoutArgs() { - // Notice the block runs in its own frame, not the caller's frame. - return this.body.eval(this.f); - } - - // =meth Blk "eval" value: - public Pro evalWith1Arg(Pro arg0) { - if (this.params.length < 1) { - toss("Block takes <%d> params, but calling it with 1 arg: Blk=<%s> arg0=<%s>", - this.params.length, this, arg0); - } - // Notice the block runs in its own frame, not the caller's frame. - ((Expr.LValue) params[0]).store(this.f, arg0); - return this.body.eval(this.f); - } - - // =meth Blk "eval" value:value: - public Pro evalWith2Args(Pro arg0, Pro arg1) { - if (this.params.length < 2) { - toss("Block takes <%d> params, but calling it with 2 args: Blk=<%s> arg0=<%s> arg1=<%s>", - this.params.length, this, arg0, arg1); - } - // Notice the block runs in its own frame, not the caller's frame. - ((Expr.LValue) params[0]).store(this.f, arg0); - ((Expr.LValue) params[1]).store(this.f, arg1); - return this.body.eval(this.f); - } - } - - public final static class Num extends Obj { - public double num; - - // =cls "Data" Num Obj - Num(Terp t, double num) { - super(t.tNum); - this.num = num; - } - - public Num asNum() { - return this; - } - - public String toString() { - long truncated = (long) num; - if (num == truncated) { - return fmt("%d", truncated); - } else { - return fmt("%s", num); - } - } - - @Override - Comparable innerValue() { - return new Double(num); - } - - public void visit(Visitor v) { - v.visitNum(this); - } - - // =meth Num "access" chr - // "covert integer to single-char Str with that unicode codepoint" - public String chr() { - return new Character((char) toNearestInt()).toString(); - } - - // Most objects are true. - // nil and Nums that round to 0 are false. - public boolean truth() { - return toNearestInt() != 0; - } - - // =meth Num "binop" == "eq two Nums" - public Num _eq_(Num a) { - return terp().newNum(this.num == a.num ? 1 : 0); - } - - // =meth Num "binop" != "ne two Nums" - public Num _ne_(Num a) { - return terp().newNum(this.num != a.num ? 1 : 0); - } - - // =meth Num "binop" < "lt two Nums" - public Num _lt_(Num a) { - return terp().newNum(this.num < a.num ? 1 : 0); - } - - // =meth Num "binop" <= "le two Nums" - public Num _le_(Num a) { - return terp().newNum(this.num <= a.num ? 1 : 0); - } - - // =meth Num "binop" > "gt two Nums" - public Num _gt_(Num a) { - return terp().newNum(this.num > a.num ? 1 : 0); - } - - // =meth Num "binop" >= "ge two Nums" - public Num _ge_(Num a) { - return terp().newNum(this.num >= a.num ? 1 : 0); - } - - // =meth Num "binop" + "add two Nums" - public Num _pl_(Num a) { - return terp().newNum(this.num + a.num); - } - - // =meth Num "binop" - "add two Nums" - public Num _mi_(Num a) { - return terp().newNum(this.num - a.num); - } - - // =meth Num "binop" | "bitwise-or two Nums as 32bit integers" - public Num _or_(Num a) { - return terp().newNum((int) this.num | (int) a.num); - } - - // =meth Num "binop" ^ "bitwise-xor two Nums as 32bit integers" - public Num _xo_(Num a) { - return terp().newNum((int) this.num ^ (int) a.num); - } - - // =meth Num "binop" * "multiply two Nums" - public Num _ti_(Num a) { - return terp().newNum(this.num * a.num); - } - - // =meth Num "binop" / "divide two Nums" - public Num _di_(Num a) { - return terp().newNum(this.num / a.num); - } - - // =meth Num "binop" % "modulo two Nums" - public Num _mo_(Num a) { - return terp().newNum(this.num % a.num); - } - - // =meth Num "binop" & "bitwise-and two Nums as 32bit integers" - public Num _an_(Num a) { - return terp().newNum((int) this.num & (int) a.num); - } - - abstract static class BinaryNumPredMeth extends JavaMeth { - BinaryNumPredMeth(Terp terp, String name) { - super(terp.tNum, name, null, ""); - } - - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Num s = r.asNum(); - Num a = args[0].asNum(); - if (s == null) { - toss("Receiver of Num relop not a Num"); - } - if (a == null) { - toss("Argument of Num relop not a Num"); - } - return boolObj(compute(s.num, a.num)); - } - - abstract boolean compute(double snum, double anum); - } - - abstract static class BinaryNumMeth extends JavaMeth { - BinaryNumMeth(Terp terp, String name) { - super(terp.tNum, name, null, ""); - } - - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Num s = r.asNum(); - Num a = args[0].asNum(); - if (s == null) { - toss("Receiver of Num binop not a Num"); - } - if (a == null) { - toss("Argument of Num binop not a Num"); - } - return new Num(f.terp(), compute(s.num, a.num)); - } - - abstract double compute(double snum, double anum); - } - - abstract static class UnaryNumMeth extends JavaMeth { - UnaryNumMeth(Terp terp, String name) { - super(terp.tNum, name, null, ""); - } - - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 0; - Num s = r.asNum(); - if (s == null) { - toss("Receiver of Num unary op not a Num"); - } - return new Num(f.terp(), compute(s.num)); - } - - abstract double compute(double anum); - } - - static void addBuiltinMethodsForNum(final Terp terp) { - terp.tNum.addMethod(new JavaMeth(terp.tNum, "range", "", - "vector of numbers, starting 0, ending before self") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Num num = r.asNum(); - int n = num.toNearestInt(); - assert args.length == 0; - Pro[] arr = new Pro[n]; - for (int i = 0; i < n; i++) { - arr[i] = terp.newNum(i); - } - return new Vec(terp, arr); - } - }); - - terp.tNum.addMethod(new JavaMeth(terp.tNum, "do:", "", - "Iterate the argument block this many times, " - + "with one argument ranging from 0 up to, " - + "not including, self.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Num num = r.asNum(); - assert args.length == 1; - Blk blk = args[0].asBlk(); - double stop = num.num - 0.5; - for (double i = 0; i < stop; i++) { - blk.evalWith1Arg(new Num(f.terp(), i)); - } - return f.terp().instNil; - } - }); - - terp.tNum.addMethod(new BinaryNumPredMeth(terp, "eq:") { - boolean compute(double snum, double anum) { - return snum == anum; - } - }); - terp.tNum.addMethod(new BinaryNumPredMeth(terp, "ne:") { - boolean compute(double snum, double anum) { - return snum != anum; - } - }); - terp.tNum.addMethod(new BinaryNumPredMeth(terp, "lt:") { - boolean compute(double snum, double anum) { - return snum < anum; - } - }); - terp.tNum.addMethod(new BinaryNumPredMeth(terp, "le:") { - boolean compute(double snum, double anum) { - return snum <= anum; - } - }); - terp.tNum.addMethod(new BinaryNumPredMeth(terp, "gt:") { - boolean compute(double snum, double anum) { - return snum > anum; - } - }); - terp.tNum.addMethod(new BinaryNumPredMeth(terp, "ge:") { - boolean compute(double snum, double anum) { - return snum >= anum; - } - }); - - terp.tNum.addMethod(new BinaryNumMeth(terp, "pl:") { - double compute(double snum, double anum) { - return snum + anum; - } - }); - terp.tNum.addMethod(new BinaryNumMeth(terp, "mi:") { - double compute(double snum, double anum) { - return snum - anum; - } - }); - terp.tNum.addMethod(new BinaryNumMeth(terp, "ti:") { - double compute(double snum, double anum) { - return snum * anum; - } - }); - terp.tNum.addMethod(new BinaryNumMeth(terp, "fdiv:") { - double compute(double snum, double anum) { - return snum / anum; - } - }); - terp.tNum.addMethod(new BinaryNumMeth(terp, "idiv:") { - double compute(double snum, double anum) { - return (long) snum / (long) anum; - } - }); - terp.tNum.addMethod(new BinaryNumMeth(terp, "imod:") { - double compute(double snum, double anum) { - return (long) snum % (long) anum; - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "neg") { - double compute(double snum) { - return -snum; - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "sgn") { - double compute(double snum) { - return snum < 0 ? -1 : snum > 0 ? 1 : 0; - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "int") { - double compute(double snum) { - return (long) snum; - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "floor") { - double compute(double snum) { - return Math.floor(snum); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "abs") { - double compute(double snum) { - return Math.abs(snum); - } - }); - terp.tNumCls.addMethod(new JavaMeth(terp.tNumCls, "e", "", - "e, the base of natural logs") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return terp.newNum(Math.E); - } - }); - terp.tNumCls.addMethod(new JavaMeth(terp.tNumCls, "pi", "", "pi") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return terp.newNum(Math.PI); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "sin") { - double compute(double snum) { - return Math.sin(snum); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "cos") { - double compute(double snum) { - return Math.cos(snum); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "tan") { - double compute(double snum) { - return Math.tan(snum); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "asin") { - double compute(double snum) { - return Math.asin(snum); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "acos") { - double compute(double snum) { - return Math.acos(snum); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "atan") { - double compute(double snum) { - return Math.atan(snum); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "ln") { - double compute(double snum) { - return Math.log(snum); - } - }); - terp.tNum.addMethod(new UnaryNumMeth(terp, "log10") { - double compute(double snum) { - return Math.log10(snum); - } - }); - - terp.tNum.addMethod(new UnaryNumMeth(terp, "exp") { - double compute(double snum) { - return Math.exp(snum); - } - }); - terp.tNum.addMethod(new JavaMeth(terp.tNum, "toNumber", "num", - "num is a NOP on a Num") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return r; - } - }); - } - } - - public final static class Buf extends Obj { - StringBuffer buf; - - // =cls "Data" Buf Obj - Buf(Terp t) { - super(t.tBuf); - this.buf = new StringBuffer(); - } - - Buf(Terp t, String s) { - super(t.tBuf); - this.buf = new StringBuffer(s); - } - - public String toString() { - return fmt("~Buf~'%s'~", buf.toString()); - } - - static void addBuiltinMethodsForBuf(final Terp terp) { - terp.tBuf.addMethod(new JavaMeth(terp.tBuf, "str", "s", - "Get Str from Buf.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 0; - Buf self = (Buf) r; - return terp.newStr(self.buf.toString()); - } - }); - terp.tBuf.addMethod(new JavaMeth(terp.tBuf, "append:", "ap:", - "Append the argument to the Buf, modifying self.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Buf self = (Buf) r; - Str a = args[0].asStr(); - if (a == null) { - toss("Argument of Buf>>ap: not a Str"); - } - self.buf.append(a.str); - return r; - } - }); - terp.tBufCls.addMethod(new JavaMeth(terp.tBufCls, "new", "", - "Create new empty Buf.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 0; - return new Buf(terp); - } - }); - terp.tBufCls.addMethod(new JavaMeth(terp.tBufCls, "append:", "ap:", - "Append the argument to the Buf, modifying self.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Str a = args[0].asStr(); - if (a == null) { - toss("Argument of Buf>>ap: not a Str"); - } - return new Buf(terp, a.str); - } - }); - } - } - - public final static class Str extends Obj { - public String str; - - // =cls "Data" Str Obj - Str(Terp t, String str) { - super(t.tStr); - this.str = str; - } - - public Str asStr() { - return this; - } - - public String repr() { - if (str == null) { - return ""; - } - return fmt("'%s'", str.replaceAll("'", "''")); - } - - public String toString() { - return str; - } - - @Override - Comparable innerValue() { - return str; - } - - public void visit(Visitor v) { - v.visitStr(this); - } - - // =meth Str "access" applySubstitutions "" - public Str applySubstitutions() { - return terp().newStr(Parser.charSubsts(this.str)); - } - - // =meth Str "access" ord - // "unicode codepoint number of first char in Str" - public int ord() { - return str.charAt(0); - } - - abstract static class BinaryStrPredMeth extends JavaMeth { - BinaryStrPredMeth(Terp terp, String name) { - super(terp.tStr, name, null, ""); - } - - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Str s = (Str) r; - Str a = args[0].asStr(); - if (a == null) { - toss("Argument of Str relop not a Str"); - } - return boolObj(compute(s.str, a.str)); - } - - abstract boolean compute(String sstr, String astr); - } - - static void addBuiltinMethodsForStr(final Terp terp) { - terp.tStr.addMethod(new JavaMeth(terp.tStr, "split:", "", - "Split string into a Vec, using arg as delimiter.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Str s = (Str) r; - Str a = args[0].asStr(); - if (a == null) { - toss("Argument of Str>>spli: not a Str"); - } - // Using Java's split caused infinite recursion in - // Pattern: - // String[] parts = - // s.str.split(Pattern.quote(a.str)); - String[] parts = splitNonEmpty(s.str, a.str.charAt(0)); - Pro[] arr = new Pro[parts.length]; - for (int i = 0; i < parts.length; i++) { - arr[i] = terp.newStr(parts[i]); - } - return terp.newVec(arr); - } - }); - terp.tStr - .addMethod(new JavaMeth(terp.tStr, "append:", "ap:", - "Append the argument (as a string) to the string, modifying self.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 1; - Str s = (Str) r; - Str a = args[0].asStr(); - if (a == null) { - toss("Argument of Str>>ap: not a Str"); - } - return new Str(terp, s.str + a.str); - } - }); - terp.tStr.addMethod(new JavaMeth(terp.tStr, "substr:to:", "ss:to:", - "Substring starting at first index, " - + "ending before second index, like Java substr.") { // Substring - public Pro apply(Frame f, Pro r, Pro[] args) { - assert args.length == 2; - Str s = (Str) r; - assert (s != null); - int a = args[0].toNearestInt(); - int b = args[1].toNearestInt(); - return new Str(terp, s.str.substring(a, b)); - } - }); - terp.tStr.addMethod(new JavaMeth(terp.tStr, "head", "hd", - "First char of Str.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Str self = (Str) r; - if (self.str.length() == 0) { - toss("Cannot take head of empty Str"); - } - return terp.newStr(self.str.substring(0, 1)); - } - }); - terp.tStr.addMethod(new JavaMeth(terp.tStr, "tail", "tl", - "All but first char of Str.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Str self = (Str) r; - if (self.str.length() == 0) { - toss("Cannot take tail of empty Str"); - } - return terp.newStr(self.str.substring(1)); - } - }); - terp.tStr.addMethod(new JavaMeth(terp.tStr, "length", "len", - "Length of Str.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return terp.newNum(((Str) r).str.length()); - } - }); - terp.tStr.addMethod(new JavaMeth(terp.tStr, "toNumber", "num", - "Convert ASCII Str to Num") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Str self = (Str) r; - double x = 0; - try { - x = new Float(self.str); - } catch (NumberFormatException ex) { - toss("Cannot convert Str to Num: <%s>", self.str); - } - return terp.newNum(x); - } - }); - terp.tStr.addMethod(new JavaMeth(terp.tStr, "toLower", "low", - "Convert string to lowercase.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return terp.newStr(((Str) r).str.toLowerCase()); - } - }); - terp.tStr.addMethod(new JavaMeth(terp.tStr, "toUpper", "upp", - "Convert string to uppercase.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return terp.newStr(((Str) r).str.toUpperCase()); - } - }); - terp.tStr.addMethod(new JavaMeth(terp.tStr, "trimWhite", "trimw", - "Trim whitespace from front and back.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return terp.newStr(((Str) r).str.trim()); - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "eq:") { - boolean compute(String sstr, String astr) { - return sstr.compareTo(astr) == 0; - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "ne:") { - boolean compute(String sstr, String astr) { - return sstr.compareTo(astr) != 0; - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "lt:") { - boolean compute(String sstr, String astr) { - return sstr.compareTo(astr) < 0; - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "le:") { - boolean compute(String sstr, String astr) { - return sstr.compareTo(astr) <= 0; - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "gt:") { - boolean compute(String sstr, String astr) { - return sstr.compareTo(astr) > 0; - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "ge:") { - boolean compute(String sstr, String astr) { - return sstr.compareTo(astr) >= 0; - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "starts:") { - boolean compute(String sstr, String astr) { - return sstr.startsWith(astr); - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "ends:") { - boolean compute(String sstr, String astr) { - return sstr.endsWith(astr); - } - }); - terp.tStr.addMethod(new BinaryStrPredMeth(terp, "matchp:") { - boolean compute(String sstr, String astr) { - return Pattern.matches(astr, sstr); - } - }); - } - } - - public final static class Vec extends Obj { - public ArrayList vec; - - // =cls "Data" Vec Obj - public Vec(Terp t) { - super(t.tVec); - this.vec = new ArrayList(); - } - - public Vec(Terp t, Pro[] arr) { - super(t.tVec); - this.vec = new ArrayList(); - for (int i = 0; i < arr.length; i++) { - this.vec.add(arr[i]); - } - } - public Vec(Terp t, int[] arr) { - super(t.tVec); - this.vec = new ArrayList(); - for (int i = 0; i < arr.length; i++) { - this.vec.add(t.newNum(arr[i])); - } - } - - public Vec asVec() { - return this; - } - - public String toString() { - StringBuffer sb = new StringBuffer("VEC("); - for (int i = 0; i < vec.size(); i++) { - assert vec.get(i) != null; - sb.append(vec.get(i) == null ? " nil\"NULL\" " : vec.get(i) - .repr()); - sb.append("; "); - } - sb.append(") "); - return sb.toString(); - } - - public void visit(Visitor v) { - v.visitVec(this); - } - - @Override - public boolean equals(Object o) { - if (o instanceof Vec) { - Vec that = (Vec) o; - int sz = this.vec.size(); - if (sz == that.vec.size()) { - for (int i = 0; i < sz; i++) { - if (!this.vec.get(i).equals(that.vec.get(i))) { - return false; - } - } - return true; - } - } - return false; - } - - @Override - public int compareTo(Object o) { - if (o instanceof Vec) { - Vec that = (Vec) o; - int sz = this.vec.size(); - if (sz == that.vec.size()) { - for (int i = 0; i < sz; i++) { - int z = this.vec.get(i).compareTo(that.vec.get(i)); - if (z != 0) { - return z; - } - } - return 0; - } else { - return new Integer(this.vec.size()).compareTo(new Integer( - that.vec.size())); - } - } else if (o instanceof Pro) { - // Within our Pro world, order by classname, providing stability - // after filein/fileout. - Pro that = (Pro) o; - return this.cls.name.compareTo(that.cls.name); - } else { - // Against foreign objects, fall back to identity hash. - return new Integer(System.identityHashCode(this)) - .compareTo(new Integer(System.identityHashCode(o))); - } - } - - public int hashCode() { - int z = 0; - int sz = this.vec.size(); - for (int i = 0; i < sz; i++) { - z = 13 * z + this.vec.get(i).hashCode(); - } - return z; - } - - int toNearestIndex(Pro a) { - final int vlen = vec.size(); - if (vlen == 0) { - toss("Cannot index into empty Vec"); - } - Num num = a.asNum(); - if (num == null) { - toss("Index is a %s, not a Num, in ", a.cls.name); - } - int i = (int) Math.floor(num.num + 0.5); // closest int - i = ((i % vlen) + vlen) % vlen; // Positive-only Modulus - return i; - } - - // =meth Vec "access" len "return length of the Vec" - public Num _len() { - return cls.terp.newNum(vec.size()); - } - - // =meth Vec "access" at: "get element at index a, modulo length of Vec" - public Pro at_(Num a) { - return vec.get(toNearestIndex(a)); - } - - // =meth Vec "access" at:put:,at:p: - // "put element b at given a, modulo length of Vec" - public void at_put_(Num a, Pro b) { - vec.set(toNearestIndex(a), b); - } - - // =meth Vec "access" append:,ap: "add new element ato end of Vec" - public void append_(Pro a) { - vec.add(a); - } - - // =meth Vec "string" join: - // "Join strings on spaces." - public Str join(String a) { - StringBuilder sb = new StringBuilder(); - final int n = vec.size(); - for (int i = 0; i < n; i++) { - if (i > 0) { - sb.append(a); - } - sb.append(vec.get(i).toString()); - } - return terp().newStr(sb.toString()); - } - - // =meth Vec "string" join - // "Join strings on spaces." - public Str join() { - StringBuilder sb = new StringBuilder(); - final int n = vec.size(); - for (int i = 0; i < n; i++) { - sb.append(vec.get(i).toString()); - } - return terp().newStr(sb.toString()); - } - - // =meth Vec "string" jam - // "Join strings with no separator char." - public Str jam() { - StringBuilder sb = new StringBuilder(); - final int n = vec.size(); - for (int i = 0; i < n; i++) { - sb.append(vec.get(i).toString()); - } - return terp().newStr(sb.toString()); - } - - // =meth Vec "string" implode,imp - // "Implode strings and ints (as chars) and subvectors." - public Str implode() { - StringBuilder sb = new StringBuilder(); - implodeRecursive(sb); - return terp().newStr(sb.toString()); - } - - private void implodeRecursive(StringBuilder sb) { - final int n = vec.size(); - for (int i = 0; i < n; i++) { - Pro x = vec.get(i); - if (x instanceof Num) { - char ch = (char) (((Num) x).toNearestInt()); - sb.append(ch); - } else if (x instanceof Vec) { - ((Vec) x).implodeRecursive(sb); - } else { - sb.append(x.toString()); - } - } - } - - static void addBuiltinMethodsForVec(final Terp terp) { - // terp.tVec.addMethod(new JavaMeth(terp.tVec, "len", null, - // "Length of the Vec.") { - // public Num apply(Frame f, Pro r, Pro[] args) { - // return new Num(terp, r.asVec().vec.size()); - // } - // }); - // terp.tVec.addMethod(new JavaMeth(terp.tVec, "at:", null, - // "Item at given index") { - // public Pro apply(Frame f, Pro r, Pro[] args) { - // Vec self = r.asVec(); - // return self.vec.get(self.toNearestIndex(args[0])); - // } - // }); - // terp.tVec - // .addMethod(new JavaMeth(terp.tVec, "at:put:", "at:p:", "") { - // public Pro apply(Frame f, Pro r, Pro[] args) { - // Vec self = r.asVec(); - // self.vec.set(self.toNearestIndex(args[0]), args[1]); - // return r; - // } - // }); - // terp.tVec.addMethod(new JavaMeth(terp.tVec, "append:", "ap:", "") - // { - // public Pro apply(Frame f, Pro r, Pro[] args) { - // Vec self = r.asVec(); - // self.vec.add(args[0]); - // return r; - // } - // }); - // terp.tVec.addMethod(new JavaMeth(terp.tVec, "setLen:", "sl:", "") - // { - // public Pro apply(Frame f, Pro r, Pro[] args) { - // Vec self = r.asVec(); - // int oldSize = self.vec.size(); - // Num num = args[0].asNum(); - // if (num == null) { - // toss("Expected argument to be a Num; got a <%s>.", - // args[0].cls.name); - // } - // int newSize = (int) Math.floor(num.num + 0.5); // closest - // // int - // self.vec.setSize(newSize); - // for (int i = oldSize; i < newSize; i++) { - // self.vec.set(i, terp.tUndefined); - // } - // return r; - // } - // }); - terp.tVec.addMethod(new JavaMeth(terp.tVec, "doWithEach:", "do:", - "Iterate the block with one argument, " - + "for each item in the Vec.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Vec vec = r.asVec(); - assert args.length == 1; - Blk blk = args[0].asBlk(); - int stop = vec.vec.size(); - for (int i = 0; i < stop; i++) { - blk.evalWith1Arg(vec.vec.get(i)); - } - return terp.instNil; - } - }); - terp.tVecCls.addMethod(new JavaMeth(terp.tVecCls, "new", "", - "Create a new empty Vec object.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return new Vec(terp); - } - }); - terp.tVecCls.addMethod(new JavaMeth(terp.tVecCls, "append:", "ap:", - "Create a new Vec of length 1 with the given item in it." - + " Same as 'new append:'.") { - // Shortcut for "new append:" - public Pro apply(Frame f, Pro r, Pro[] args) { - Vec vec = new Vec(terp); - vec.vec.add(args[0]); - return vec; - } - }); - } - } - - public final static class Dict extends Obj { - public HashMap dict; - - // =cls "Data" Dict Obj - Dict(Terp t) { - super(t.tDict); - this.dict = new HashMap(); - } - - public Dict asDict() { - return this; - } - - public String toString() { - Vec[] aarr = sortedAssocs(); - StringBuffer sb = new StringBuffer("DICT("); - for (Vec a : aarr) { - sb.append("("); - sb.append(a.vec.get(0).repr()); - sb.append("), ("); - sb.append(a.vec.get(1).repr()); - sb.append("); "); - } - sb.append(") "); - return sb.toString(); - } - - public boolean equals(Object o) { - if (o instanceof Dict) { - Dict that = (Dict) o; - int sz = this.dict.size(); - if (sz == that.dict.size()) { - Vec[] a = this.sortedAssocs(); - Vec[] b = that.sortedAssocs(); - for (int i = 0; i < sz; i++) { - if (!a[i].vec.get(0).equals(b[i].vec.get(0)) - || !a[i].vec.get(1).equals(b[i].vec.get(1))) { - return false; - } - } - return true; - } - } - return false; - } - - public int hashCode() { - int z = 0; - Vec[] a = this.sortedAssocs(); - for (int i = 0; i < a.length; i++) { - z = 13 * z + a[i].vec.get(0).hashCode(); - z = 13 * z + a[i].vec.get(1).hashCode(); - } - return z; - } - - public void visit(Visitor v) { - v.visitDict(this); - } - - public Vec[] sortedAssocs() { - Vec[] z = new Vec[dict.size()]; - int i = 0; - for (Pro key : dict.keySet()) { - z[i] = new Vec(terp(), pros(key, dict.get(key))); - ++i; - } - Arrays.sort(z); - return z; - } - - static void addBuiltinMethodsForDict(final Terp terp) { - terp.tDict.addMethod(new JavaMeth(terp.tDict, "len", "", - "Number of entries in the Dict.") { - public Num apply(Frame f, Pro r, Pro[] args) { - return new Num(terp, r.asDict().dict.size()); - } - }); - terp.tDict.addMethod(new JavaMeth(terp.tDict, "dir", "", - "Number of entries in the Dict.") { - public Vec apply(Frame f, Pro r, Pro[] args) { - Vec z = terp.newVec(new Vec[0]); - for (Vec aa : r.asDict().sortedAssocs()) { - z.vec.add(aa.vec.get(0)); - } - return z; - } - }); - terp.tDict - .addMethod(new JavaMeth(terp.tDict, "at:", "", - "Return the value stored at the given key, or Nil if it is missing.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Dict self = r.asDict(); - Pro z = self.dict.get(args[0]); - if (z == null) { - return terp.instNil; - } - return z; - } - }); - terp.tDict.addMethod(new JavaMeth(terp.tDict, "at:put:", "at:p:", - "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Dict self = r.asDict(); - self.dict.put(args[0], args[1]); - return r; - } - }); - terp.tDictCls.addMethod(new JavaMeth(terp.tDictCls, "new", "", - "Create a new empty Dict object.") { - public Pro apply(Frame f, Pro r, Pro[] args) { - return new Dict(terp); - } - }); - } - } - - public static class Ht extends Static { // For XSS Safety. - private StringBuffer sb; - - public Ht() { - this.sb = new StringBuffer(); - } - - public Ht(Ht that) { - this.sb = new StringBuffer(that.sb.toString()); - } - - public Ht(String s) { - this.sb = new StringBuffer(Static.htmlEscape(s)); - } - - public String toString() { - return sb.toString(); - } - - public Ht append(String s) { - sb.append(htmlEscape(s)); - return this; - } - - public Ht append(Ht that) { - sb.append(that.toString()); - return this; - } - - public Ht appendLink(String link, String label) { - Ht.tag(this, "a", strs("href", link), label); - return this; - } - - public Ht append(Pro that) { - sb.append(htmlEscape(that.toString())); - return this; - } - - static public Ht entity(String name) { - Ht ht = new Ht(); - ht.sb.append(fmt("&%s;", name)); - return ht; - } - - static public Ht tag(Ht appendMe, String type, String[] args, - String body) { - return tag(appendMe, type, args, new Ht(body)); - } - - static public Ht tag(Ht appendMe, String type, String[] args, Ht body) { - Ht z = appendMe == null ? new Ht() : appendMe; - assert htmlTagP.matcher(type).matches(); - z.sb.append(fmt("<%s ", type)); - if (args != null) { - for (int i = 0; i < args.length; i += 2) { - assert htmlTagP.matcher(args[i]).matches(); - z.sb.append(fmt("%s=\"%s\" ", args[i], - htmlEscape(args[i + 1]))); - } - } - z.sb.append(fmt(">%s", body, type)); - return z; - } - - static public Ht tag(Ht appendMe, String type, String[] args) { - Ht z = appendMe == null ? new Ht() : appendMe; - assert htmlTagP.matcher(type).matches(); - z.sb.append(fmt("<%s ", type)); - if (args != null) { - for (int i = 0; i < args.length; i += 2) { - assert htmlTagP.matcher(args[i]).matches(); - z.sb.append(fmt("%s=\"%s\" ", args[i], - htmlEscape(args[i + 1]))); - } - } - z.sb.append(" />"); - return z; - } - } - - public static class Visitor { - protected Terp t; - - public Visitor(Terp t) { - super(); - this.t = t; - } - - public void visitPro(Pro a) { - t.toss("SubclassResponsibility(Visitor::visitPro)"); - } - - public void visitCls(Cls a) { - visitPro(a); - } - - public void visitNum(Num a) { - visitPro(a); - } - - public void visitStr(Str a) { - visitPro(a); - } - - public void visitUndefined(Undefined a) { - visitPro(a); - } - - public void visitVec(Vec a) { - visitPro(a); - } - - public void visitDict(Dict a) { - visitPro(a); - } - - public void visitUsr(Usr a) { - visitPro(a); - } - } -} rmfile ./terse-vm/src/terse/vm/Pro.java hunk ./terse-vm/src/terse/vm/Static.java 7 -import terse.vm.Pro.Dict; -import terse.vm.Pro.Num; -import terse.vm.Pro.Str; -import terse.vm.Pro.Vec; +import terse.vm.Ur.Dict; +import terse.vm.Ur.Num; +import terse.vm.Ur.Str; +import terse.vm.Ur.Vec; hunk ./terse-vm/src/terse/vm/Static.java 27 - (args[i] instanceof Pro) ? ((Pro) args[i]).cls.name + (args[i] instanceof Ur) ? ((Ur) args[i]).cls.name hunk ./terse-vm/src/terse/vm/Static.java 64 - public static String arrayToString(Pro[] a) { + public static String arrayToString(Ur[] a) { hunk ./terse-vm/src/terse/vm/Static.java 66 - for (Pro e : a) { + for (Ur e : a) { hunk ./terse-vm/src/terse/vm/Static.java 152 - public static Pro[] pros(Pro... pros) { + public static Ur[] pros(Ur... pros) { hunk ./terse-vm/src/terse/vm/Static.java 156 - public static Pro[] emptyPros = new Pro[0]; + public static Ur[] emptyPros = new Ur[0]; hunk ./terse-vm/src/terse/vm/Static.java 158 - public static Pro[] append(Pro[] arr, Pro s) { + public static Ur[] append(Ur[] arr, Ur s) { hunk ./terse-vm/src/terse/vm/Static.java 160 - return new Pro[] { s }; + return new Ur[] { s }; hunk ./terse-vm/src/terse/vm/Static.java 162 - Pro[] z = Arrays.copyOf(arr, arr.length + 1); + Ur[] z = Arrays.copyOf(arr, arr.length + 1); hunk ./terse-vm/src/terse/vm/Static.java 206 - public static String stringAt(Pro p, String i) { + public static String stringAt(Ur p, String i) { hunk ./terse-vm/src/terse/vm/Static.java 210 - public static String stringAt(Pro p, String i, String dflt) { + public static String stringAt(Ur p, String i, String dflt) { hunk ./terse-vm/src/terse/vm/Static.java 214 - Pro x = d.dict.get(d.terp().newStr(i)); + Ur x = d.dict.get(d.terp().newStr(i)); hunk ./terse-vm/src/terse/vm/Static.java 219 - public static double floatAt(Pro p, String i, double dflt) { + public static double floatAt(Ur p, String i, double dflt) { hunk ./terse-vm/src/terse/vm/Static.java 223 - Pro x = d.dict.get(d.terp().newStr(i)); + Ur x = d.dict.get(d.terp().newStr(i)); hunk ./terse-vm/src/terse/vm/Static.java 228 - public static Pro proAt(Pro p, String i) { + public static Ur proAt(Ur p, String i) { hunk ./terse-vm/src/terse/vm/Static.java 235 - public static String stringAt(Pro p, int i) { + public static String stringAt(Ur p, int i) { hunk ./terse-vm/src/terse/vm/Static.java 238 - public static String stringAt(Pro p, int i, String dflt) { + public static String stringAt(Ur p, int i, String dflt) { hunk ./terse-vm/src/terse/vm/Static.java 245 - Pro x = v.vec.get(i); + Ur x = v.vec.get(i); hunk ./terse-vm/src/terse/vm/Static.java 251 - public static float floatAt(Pro p, int i) { + public static float floatAt(Ur p, int i) { hunk ./terse-vm/src/terse/vm/Static.java 258 - Pro x = v.vec.get(i); + Ur x = v.vec.get(i); hunk ./terse-vm/src/terse/vm/Terp.java 17 -import terse.vm.Pro.Blk; -import terse.vm.Pro.Buf; -import terse.vm.Pro.Dict; -import terse.vm.Pro.Undefined; -import terse.vm.Pro.Num; -import terse.vm.Pro.Obj; -import terse.vm.Pro.Str; -import terse.vm.Pro.Sys; -import terse.vm.Pro.Vec; +import terse.vm.Ur.Blk; +import terse.vm.Ur.Buf; +import terse.vm.Ur.Dict; +import terse.vm.Ur.Undefined; +import terse.vm.Ur.Num; +import terse.vm.Ur.Obj; +import terse.vm.Ur.Str; +import terse.vm.Ur.Sys; +import terse.vm.Ur.Vec; hunk ./terse-vm/src/terse/vm/Terp.java 86 - Pro.Super instSuper; + Ur.Super instSuper; hunk ./terse-vm/src/terse/vm/Terp.java 107 - this.tPro = new Cls(tProCls, this, "Pro", null/* Pro has no super */); + this.tPro = new Cls(tProCls, this, "Ur", null/* Ur has no super */); hunk ./terse-vm/src/terse/vm/Terp.java 131 - // Super is a very special class, from Pro, not from Obj. + // Super is a very special class, from Ur, not from Obj. hunk ./terse-vm/src/terse/vm/Terp.java 172 - this.instSuper = new Pro.Super(this); + this.instSuper = new Ur.Super(this); hunk ./terse-vm/src/terse/vm/Terp.java 176 - Pro.addBuiltinMethodsForPro(this); + Ur.addBuiltinMethodsForPro(this); hunk ./terse-vm/src/terse/vm/Terp.java 211 - public Frame newFrame(Frame prev, Pro self, Expr.Top top) { + public Frame newFrame(Frame prev, Ur self, Expr.Top top) { hunk ./terse-vm/src/terse/vm/Terp.java 220 - Pro self; - // =get Frame Pro[] locals localVars - Pro[] locals; + Ur self; + // =get Frame Ur[] locals localVars + Ur[] locals; hunk ./terse-vm/src/terse/vm/Terp.java 229 - private Frame(Frame prev, Pro self, Expr.Top top) { + private Frame(Frame prev, Ur self, Expr.Top top) { hunk ./terse-vm/src/terse/vm/Terp.java 235 - this.locals = new Pro[top.numLocals]; + this.locals = new Ur[top.numLocals]; hunk ./terse-vm/src/terse/vm/Terp.java 269 - final public Dict newDict(Pro[] arr) { + final public Dict newDict(Ur[] arr) { hunk ./terse-vm/src/terse/vm/Terp.java 288 - final public Vec newVec(Pro[] a) { + final public Vec newVec(Ur[] a) { hunk ./terse-vm/src/terse/vm/Terp.java 297 - Pro[] arr = new Pro[strs.length]; + Ur[] arr = new Ur[strs.length]; hunk ./terse-vm/src/terse/vm/Terp.java 305 - Pro[] arr = new Pro[strs.length]; + Ur[] arr = new Ur[strs.length]; hunk ./terse-vm/src/terse/vm/Terp.java 315 - Pro[] queryArr = new Pro[query.size()]; + Ur[] queryArr = new Ur[query.size()]; hunk ./terse-vm/src/terse/vm/Terp.java 324 - Pro queryKey = newStr(k); - Pro queryValue = newStr(v.replaceAll("\r\n", "\n")); + Ur queryKey = newStr(k); + Ur queryValue = newStr(v.replaceAll("\r\n", "\n")); hunk ./terse-vm/src/terse/vm/Terp.java 349 - Pro result_pro = instNil; + Ur result_pro = instNil; hunk ./terse-vm/src/terse/vm/Terp.java 369 - Pro instance = cls.eval("self new"); + Ur instance = cls.eval("self new"); hunk ./terse-vm/src/terse/vm/Terp.java 396 - Pro[] dict_arr = pros( + Ur[] dict_arr = pros( hunk ./terse-vm/src/terse/vm/Terp.java 510 - Pro p1 = newTmp().eval(expected); - Pro p2 = newTmp().eval(more); + Ur p1 = newTmp().eval(expected); + Ur p2 = newTmp().eval(more); hunk ./terse-vm/src/terse/vm/Terp.java 547 - public Pro toss(String s, Object... objects) { + public Ur toss(String s, Object... objects) { hunk ./terse-vm/src/terse/vm/Terp.java 556 - public Pro tossNotUnderstood(Cls c, String msg) { + public Ur tossNotUnderstood(Cls c, String msg) { hunk ./terse-vm/src/terse/vm/Usr.java 8 -import terse.vm.Pro.Obj; +import terse.vm.Ur.Obj; hunk ./terse-vm/src/terse/vm/Usr.java 62 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Usr.java 71 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 20 -import terse.vm.Pro.Blk; -import terse.vm.Pro.Buf; -import terse.vm.Pro.Dict; -import terse.vm.Pro.Undefined; -import terse.vm.Pro.Num; -import terse.vm.Pro.Obj; -import terse.vm.Pro.Str; -import terse.vm.Pro.Sys; -import terse.vm.Pro.Vec; +import terse.vm.Ur.Blk; +import terse.vm.Ur.Buf; +import terse.vm.Ur.Dict; +import terse.vm.Ur.Undefined; +import terse.vm.Ur.Num; +import terse.vm.Ur.Obj; +import terse.vm.Ur.Str; +import terse.vm.Ur.Sys; +import terse.vm.Ur.Vec; hunk ./terse-vm/src/terse/vm/Wrap.java 36 - new JavaMeth(terp.wrap.clsPro, "cls", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Pro self = (Pro) r; + new JavaMeth(terp.wrap.clsUr, "cls", "") { + public Ur apply(Frame f, Ur r, Ur[] args) { + Ur self = (Ur) r; hunk ./terse-vm/src/terse/vm/Wrap.java 42 - new JavaMeth(terp.wrap.clsPro, "peekInstVars", "") { - public Pro apply(Frame f, Pro r, Pro[] args) { - Pro self = (Pro) r; + new JavaMeth(terp.wrap.clsUr, "peekInstVars", "") { + public Ur apply(Frame f, Ur r, Ur[] args) { + Ur self = (Ur) r; hunk ./terse-vm/src/terse/vm/Wrap.java 52 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 58 - // CMD meth Obj "macro" macro:vec: "Execute the block to return a vector." TYPE Pro NAME macroVec PARAMS {Frame _} { Blk b} + // CMD meth Obj "macro" macro:vec: "Execute the block to return a vector." TYPE Ur NAME macroVec PARAMS {Frame _} { Blk b} hunk ./terse-vm/src/terse/vm/Wrap.java 62 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 70 - // CMD meth Obj "macro" macro:dict: "Construct a Dict from list of pairs." TYPE Pro NAME macroDict PARAMS {Frame _} { Blk b} + // CMD meth Obj "macro" macro:dict: "Construct a Dict from list of pairs." TYPE Ur NAME macroDict PARAMS {Frame _} { Blk b} hunk ./terse-vm/src/terse/vm/Wrap.java 74 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 82 - // CMD meth Obj "macro" macro:for:do: TYPE Pro NAME macroForDo PARAMS {Frame _} { Blk b} { Blk c} + // CMD meth Obj "macro" macro:for:do: TYPE Ur NAME macroForDo PARAMS {Frame _} { Blk b} { Blk c} hunk ./terse-vm/src/terse/vm/Wrap.java 86 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 95 - // CMD meth Obj "macro" macro:for:map: TYPE Pro NAME macroForMap PARAMS {Frame _} { Blk b} { Blk c} + // CMD meth Obj "macro" macro:for:map: TYPE Ur NAME macroForMap PARAMS {Frame _} { Blk b} { Blk c} hunk ./terse-vm/src/terse/vm/Wrap.java 99 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 108 - // CMD meth Obj "macro" macro:for:init:reduce: TYPE Pro NAME macroForMap PARAMS {Frame _} { Blk b} { Blk init} { Blk c} + // CMD meth Obj "macro" macro:for:init:reduce: TYPE Ur NAME macroForMap PARAMS {Frame _} { Blk b} { Blk init} { Blk c} hunk ./terse-vm/src/terse/vm/Wrap.java 112 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 122 - // CMD meth Obj "macro" macro:if:then: TYPE Pro NAME macroIfThenElse PARAMS {Frame _} { Blk b} { Blk c} + // CMD meth Obj "macro" macro:if:then: TYPE Ur NAME macroIfThenElse PARAMS {Frame _} { Blk b} { Blk c} hunk ./terse-vm/src/terse/vm/Wrap.java 126 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 135 - // CMD meth Obj "macro" macro:if:then:else: TYPE Pro NAME macroIfThenElse PARAMS {Frame _} { Blk b} { Blk c} { Blk d} + // CMD meth Obj "macro" macro:if:then:else: TYPE Ur NAME macroIfThenElse PARAMS {Frame _} { Blk b} { Blk c} { Blk d} hunk ./terse-vm/src/terse/vm/Wrap.java 139 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 149 - // CMD meth Obj "macro" macro:if:then:elif:then:else: TYPE Pro NAME macroIfThenElse PARAMS {Frame _} { Blk b} { Blk c} { Blk d} { Blk e} { Blk f} + // CMD meth Obj "macro" macro:if:then:elif:then:else: TYPE Ur NAME macroIfThenElse PARAMS {Frame _} { Blk b} { Blk c} { Blk d} { Blk e} { Blk f} hunk ./terse-vm/src/terse/vm/Wrap.java 153 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 165 - // CMD meth Obj "macro" macro:if:then:elif:then: TYPE Pro NAME macroIfThenElse PARAMS {Frame _} { Blk b} { Blk c} { Blk d} { Blk e} + // CMD meth Obj "macro" macro:if:then:elif:then: TYPE Ur NAME macroIfThenElse PARAMS {Frame _} { Blk b} { Blk c} { Blk d} { Blk e} hunk ./terse-vm/src/terse/vm/Wrap.java 169 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 180 - // CMD meth Obj "macro" macro:and: TYPE Pro NAME macroAnd PARAMS {Frame _} { Blk b} + // CMD meth Obj "macro" macro:and: TYPE Ur NAME macroAnd PARAMS {Frame _} { Blk b} hunk ./terse-vm/src/terse/vm/Wrap.java 184 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 192 - // CMD meth Obj "macro" macro:or: TYPE Pro NAME macroOr PARAMS {Frame _} { Blk b} + // CMD meth Obj "macro" macro:or: TYPE Ur NAME macroOr PARAMS {Frame _} { Blk b} hunk ./terse-vm/src/terse/vm/Wrap.java 196 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 204 - // CMD meth Obj "eval" eval: "Evaluate a string as code in this receiver." TYPE Pro NAME eval PARAMS {String code} + // CMD meth Obj "eval" eval: "Evaluate a string as code in this receiver." TYPE Ur NAME eval PARAMS {String code} hunk ./terse-vm/src/terse/vm/Wrap.java 208 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 215 - // CMD meth Obj "eval" eval:arg: "Evaluate a string as code in this receiver." TYPE Pro NAME eval PARAMS {String code} { Pro a} + // CMD meth Obj "eval" eval:arg: "Evaluate a string as code in this receiver." TYPE Ur NAME eval PARAMS {String code} { Ur a} hunk ./terse-vm/src/terse/vm/Wrap.java 219 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 222 - Pro b = (Pro) args[1]; + Ur b = (Ur) args[1]; hunk ./terse-vm/src/terse/vm/Wrap.java 227 - // CMD meth Obj "eval" eval:arg:arg: "Evaluate a string as code in this receiver." TYPE Pro NAME eval PARAMS {String code} { Pro a} { Pro b} + // CMD meth Obj "eval" eval:arg:arg: "Evaluate a string as code in this receiver." TYPE Ur NAME eval PARAMS {String code} { Ur a} { Ur b} hunk ./terse-vm/src/terse/vm/Wrap.java 231 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 234 - Pro b = (Pro) args[1]; - Pro c = (Pro) args[2]; + Ur b = (Ur) args[1]; + Ur c = (Ur) args[2]; hunk ./terse-vm/src/terse/vm/Wrap.java 244 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 250 - // CMD meth SysCls "io" read: "Read a text file as one big Str." TYPE Pro NAME readTxt PARAMS {Terp terp} { String filename} + // CMD meth SysCls "io" read: "Read a text file as one big Str." TYPE Ur NAME readTxt PARAMS {Terp terp} { String filename} hunk ./terse-vm/src/terse/vm/Wrap.java 254 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 265 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 278 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 291 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 301 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 313 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 326 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 337 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 344 - // CMD meth SysCls "sys" trigraphs "keyboard character substitution dict" TYPE Pro NAME trigraphs PARAMS {Terp terp} + // CMD meth SysCls "sys" trigraphs "keyboard character substitution dict" TYPE Ur NAME trigraphs PARAMS {Terp terp} hunk ./terse-vm/src/terse/vm/Wrap.java 348 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 354 - // CMD meth Blk "param" storeAtParam0: TYPE void NAME storeAtParam0 PARAMS {Pro x} + // CMD meth Blk "param" storeAtParam0: TYPE void NAME storeAtParam0 PARAMS {Ur x} hunk ./terse-vm/src/terse/vm/Wrap.java 358 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 360 - Pro a = (Pro) args[0]; + Ur a = (Ur) args[0]; hunk ./terse-vm/src/terse/vm/Wrap.java 366 - // CMD meth Blk "param" storeAtParam1: TYPE void NAME storeAtParam1 PARAMS {Pro x} + // CMD meth Blk "param" storeAtParam1: TYPE void NAME storeAtParam1 PARAMS {Ur x} hunk ./terse-vm/src/terse/vm/Wrap.java 370 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 372 - Pro a = (Pro) args[0]; + Ur a = (Ur) args[0]; hunk ./terse-vm/src/terse/vm/Wrap.java 378 - // CMD meth Blk "param" storeAtParamKV: TYPE void NAME storeAtParamKV PARAMS {Pro k} { Pro v} + // CMD meth Blk "param" storeAtParamKV: TYPE void NAME storeAtParamKV PARAMS {Ur k} { Ur v} hunk ./terse-vm/src/terse/vm/Wrap.java 382 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 384 - Pro a = (Pro) args[0]; - Pro b = (Pro) args[1]; + Ur a = (Ur) args[0]; + Ur b = (Ur) args[1]; hunk ./terse-vm/src/terse/vm/Wrap.java 391 - // CMD meth Blk "eval" value TYPE Pro NAME evalWithoutArgs PARAMS + // CMD meth Blk "eval" value TYPE Ur NAME evalWithoutArgs PARAMS hunk ./terse-vm/src/terse/vm/Wrap.java 395 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 401 - // CMD meth Blk "eval" value: TYPE Pro NAME evalWith1Arg PARAMS {Pro arg0} + // CMD meth Blk "eval" value: TYPE Ur NAME evalWith1Arg PARAMS {Ur arg0} hunk ./terse-vm/src/terse/vm/Wrap.java 405 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 407 - Pro a = (Pro) args[0]; + Ur a = (Ur) args[0]; hunk ./terse-vm/src/terse/vm/Wrap.java 412 - // CMD meth Blk "eval" value:value: TYPE Pro NAME evalWith2Args PARAMS {Pro arg0} { Pro arg1} + // CMD meth Blk "eval" value:value: TYPE Ur NAME evalWith2Args PARAMS {Ur arg0} { Ur arg1} hunk ./terse-vm/src/terse/vm/Wrap.java 416 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 418 - Pro a = (Pro) args[0]; - Pro b = (Pro) args[1]; + Ur a = (Ur) args[0]; + Ur b = (Ur) args[1]; hunk ./terse-vm/src/terse/vm/Wrap.java 428 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 439 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 450 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 461 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 472 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 483 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 494 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 505 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 516 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 527 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 538 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 549 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 560 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 571 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 582 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 593 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 603 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 613 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 619 - // CMD meth Vec "access" at: "get element at index a, modulo length of Vec" TYPE Pro NAME at_ PARAMS {Num a} + // CMD meth Vec "access" at: "get element at index a, modulo length of Vec" TYPE Ur NAME at_ PARAMS {Num a} hunk ./terse-vm/src/terse/vm/Wrap.java 623 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 630 - // CMD meth Vec "access" at:put:,at:p: "put element b at given a, modulo length of Vec" TYPE void NAME at_put_ PARAMS {Num a} { Pro b} + // CMD meth Vec "access" at:put:,at:p: "put element b at given a, modulo length of Vec" TYPE void NAME at_put_ PARAMS {Num a} { Ur b} hunk ./terse-vm/src/terse/vm/Wrap.java 634 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 637 - Pro b = (Pro) args[1]; + Ur b = (Ur) args[1]; hunk ./terse-vm/src/terse/vm/Wrap.java 643 - // CMD meth Vec "access" append:,ap: "add new element ato end of Vec" TYPE void NAME append_ PARAMS {Pro a} + // CMD meth Vec "access" append:,ap: "add new element ato end of Vec" TYPE void NAME append_ PARAMS {Ur a} hunk ./terse-vm/src/terse/vm/Wrap.java 647 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 649 - Pro a = (Pro) args[0]; + Ur a = (Ur) args[0]; hunk ./terse-vm/src/terse/vm/Wrap.java 659 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 670 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 680 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 690 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 697 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 703 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 709 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 715 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 721 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 727 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 733 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 739 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 744 - // CMD meth Expr "eval" evalFrame: TYPE Pro NAME eval PARAMS {Frame f); final Expr setFront(String front} + // CMD meth Expr "eval" evalFrame: TYPE Ur NAME eval PARAMS {Frame f); final Expr setFront(String front} hunk ./terse-vm/src/terse/vm/Wrap.java 748 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 759 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 765 - // CMD meth LValue "parser" storeFrame:value: TYPE void NAME store PARAMS {Frame f} { Pro x); // =meth LValue "parser" recallFrame: public abstract Pro recall(Frame f); public abstract void fixIndices(Parser p} + // CMD meth LValue "parser" storeFrame:value: TYPE void NAME store PARAMS {Frame f} { Ur x); // =meth LValue "parser" recallFrame: public abstract Ur recall(Frame f); public abstract void fixIndices(Parser p} hunk ./terse-vm/src/terse/vm/Wrap.java 769 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 772 - Pro b = (Pro) args[1]; + Ur b = (Ur) args[1]; hunk ./terse-vm/src/terse/vm/Wrap.java 779 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 785 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 791 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 797 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 803 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 809 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 815 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 821 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 827 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 833 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 839 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 845 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 851 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 860 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 870 - public Pro apply(Frame frame, Pro r, Pro[] args) { + public Ur apply(Frame frame, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 879 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 885 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 891 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 897 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 903 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 909 - public Pro apply(Frame f, Pro r, Pro[] args) { + public Ur apply(Frame f, Ur r, Ur[] args) { hunk ./terse-vm/src/terse/vm/Wrap.java 925 - this.clsSuperCls = new Cls(terp.tMetaclsCls, terp, "SuperCls", this.clsProCls); + this.clsSuperCls = new Cls(terp.tMetaclsCls, terp, "SuperCls", this.clsUrCls); hunk ./terse-vm/src/terse/vm/Wrap.java 929 - this.clsSuper = new Cls(this.clsSuperCls, terp, "Super", this.clsPro); + this.clsSuper = new Cls(this.clsSuperCls, terp, "Super", this.clsUr); hunk ./terse-vm/src/terse/vm/Wrap.java 934 - this.clsObjCls = new Cls(terp.tMetaclsCls, terp, "ObjCls", this.clsProCls); + this.clsObjCls = new Cls(terp.tMetaclsCls, terp, "ObjCls", this.clsUrCls); hunk ./terse-vm/src/terse/vm/Wrap.java 938 - this.clsObj = new Cls(this.clsObjCls, terp, "Obj", this.clsPro); + this.clsObj = new Cls(this.clsObjCls, terp, "Obj", this.clsUr); hunk ./terse-vm/src/terse/vm/Wrap.java 1287 - public Cls clsProCls; - public Cls clsPro; + public Cls clsUrCls; + public Cls clsUr; hunk ./terse-vm/src/terse/vm/wrap.tcl 43 - puts " public Pro apply(Frame frame, Pro r, Pro\[\] args) {" + puts " public Ur apply(Frame frame, Ur r, Ur\[\] args) {" hunk ./terse-vm/src/terse/vm/wrap.tcl 143 - puts " public Pro apply(Frame f, Pro r, Pro\[\] args) {" + puts " public Ur apply(Frame f, Ur r, Ur\[\] args) {" hunk ./terse-vm/src/terse/vm/wrap.tcl 153 - } elseif { $type == {Pro[]} } { + } elseif { $type == {Ur[]} } { hunk ./terse-vm/src/terse/vm/wrap.tcl 159 - #} elseif { $type == {Pro[]} } { + #} elseif { $type == {Ur[]} } { hunk ./terse-vm/src/terse/vm/wrap.tcl 201 -import terse.vm.Pro.Blk; -import terse.vm.Pro.Buf; -import terse.vm.Pro.Dict; -import terse.vm.Pro.Undefined; -import terse.vm.Pro.Num; -import terse.vm.Pro.Obj; -import terse.vm.Pro.Str; -import terse.vm.Pro.Sys; -import terse.vm.Pro.Vec; +import terse.vm.Ur.Blk; +import terse.vm.Ur.Buf; +import terse.vm.Ur.Dict; +import terse.vm.Ur.Undefined; +import terse.vm.Ur.Num; +import terse.vm.Ur.Obj; +import terse.vm.Ur.Str; +import terse.vm.Ur.Sys; +import terse.vm.Ur.Vec; hunk ./terse-web/prelude.txt 120 + '|link|/HelloWeb|[HelloWeb]|'; hunk ./terse-web/prelude.txt 138 + '|link|/HelloWeb|[HelloWeb]|', 'HelloWeb '; hunk ./terse-web/prelude.txt 396 + hunk ./terse-web/prelude.txt 399 - 'value', ' -
    • hello
    • world
    • !
    '; - ) + 'value', ' +
      +
    • Test. +
    • hello +
    • world +
    • Go Home + ' ap: + FOR(i:100)MAP( + VEC('
    • ', i) jam + ) implode + ) hunk ./terse-web/src/terse/web/WebServer.java 19 -import terse.vm.Pro.Dict; -import terse.vm.Pro.Ht; -import terse.vm.Pro.Undefined; -import terse.vm.Pro.Num; -import terse.vm.Pro.Str; -import terse.vm.Pro.Vec; -import terse.vm.Pro.Visitor; +import terse.vm.Ur.Dict; +import terse.vm.Ur.Ht; +import terse.vm.Ur.Undefined; +import terse.vm.Ur.Num; +import terse.vm.Ur.Str; +import terse.vm.Ur.Vec; +import terse.vm.Ur.Visitor; hunk ./terse-web/src/terse/web/WebServer.java 28 -import terse.vm.Pro; +import terse.vm.Ur; hunk ./terse-web/src/terse/web/WebServer.java 70 - public void visitPro(Pro a) { - ht.append("\"Pro:\"" + a.toString()); + public void visitPro(Ur a) { + ht.append("\"Ur:\"" + a.toString()); hunk ./terse-web/src/terse/web/WebServer.java 157 - Ht maybeLink(Pro x, HashMap query) { + Ht maybeLink(Ur x, HashMap query) { hunk ./terse-web/src/terse/web/WebServer.java 166 - String maybeString(Pro x, String defaultString) { + String maybeString(Ur x, String defaultString) { hunk ./terse-web/src/terse/web/WebServer.java 270 - Pro width = dict.dict.get(terp.newStr("width")); - Pro height = dict.dict.get(terp.newStr("height")); + Ur width = dict.dict.get(terp.newStr("width")); + Ur height = dict.dict.get(terp.newStr("height")); hunk ./terse-web/src/terse/web/WebServer.java 310 - Pro x = tuple.vec.get(j); + Ur x = tuple.vec.get(j); hunk ./terse-web/src/terse/web/WebServer.java 351 - String s = ((Pro) fb.vec.get(i)).asStr().str; + String s = ((Ur) fb.vec.get(i)).asStr().str;