Skip to content

Commit

Permalink
quad cleanup
Browse files Browse the repository at this point in the history
and noone saw that ¯⍝⋄ weren't in the codepage ಠ_ಠ
  • Loading branch information
dzaima committed Jun 3, 2020
1 parent 2ec7342 commit b082a57
Showing 2 changed files with 47 additions and 34 deletions.
15 changes: 12 additions & 3 deletions src/APL/Main.java
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@

@SuppressWarnings("WeakerAccess") // for use as a library
public class Main {
public static final String CODEPAGE = "\0\0\0\0\0\0\0\0\0\t\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~÷×↑↓⌈⌊≠∊⍺⍴⍵⍳∍⋾⎕⍞⌸⌺⍇⍁⍂⌻⌼⍃⍄⍈⍌⍍⍐⍓⍔⍗⍯⍰⍠⌹⊆⊇⍶⍸⍹⍘⍚⍛⍜⍊≤≥⍮ϼ⍷⍉⌽⊖⊙⌾○∘⍟⊗¨⍨⍡⍥⍩⍣⍢⍤⊂⊃∩∪⊥⊤∆∇⍒⍋⍫⍱⍲∨∧⍬⊣⊢⌷⍕⍎←→⍅⍆⍏⍖⌿⍀⍪≡≢⍦⍧⍭‽⍑∞…√ᑈᐵ";
public static final String CODEPAGE = "\0\0\0\0\0\0\0\0\0\t\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~÷×↑↓⌈⌊≠∊⍺⍴⍵⍳∍⋾⎕⍞⌸⌺⍇⍁⍂⌻⌼⍃⍄⍈⍌⍍⍐⍓⍔⍗⍯⍰⍠⌹⊆⊇⍶⍸⍹⍘⍚⍛⍜⍊≤≥⍮ϼ⍷⍉⌽⊖⊙⌾○∘⍟⊗¨⍨⍡⍥⍩⍣⍢⍤⊂⊃∩∪⊥⊤∆∇⍒⍋⍫⍱⍲∨∧⍬⊣⊢⌷⍕⍎←→⍅⍆⍏⍖⌿⍀⍪≡≢⍦⍧⍭‽⍑∞…√ᑈᐵ¯⍝⋄⌶⍙";
public static boolean debug = false;
public static boolean vind = false; // vector indexing
public static boolean noBoxing = false;
@@ -52,10 +52,11 @@ public static void main(String[] args) {
println("-r : start the REPL after everything else");
println("-s : start the REPL without \">\" after everything else");
println("-d : enable debug mode");
println("-q : enable quoting of strings");
println("-q : quote strings in output");
println("-b : disable boxing");
println("-c : disable colorful printing");
println("-q : define quads in the next argument");
println("-q : enable quoting strings");
println("⎕A←B : set quad A to B");
println("-D file: run the file as SBCS");
println("-E a b : encode the file A in the SBCS, save as B");
println("If given no arguments, an implicit -r will be added");
@@ -71,6 +72,8 @@ public static void main(String[] args) {
String name = args[++i];
exec(readFile(name), global);
break;
case '⎕':
throw new DomainError("⎕ settings must be a separate argument");
case 'e':
String code = args[++i];
exec(code, global);
@@ -141,6 +144,12 @@ public static void main(String[] args) {
}
}
}
} else if (p.charAt(0)=='⎕') {
int si = p.indexOf('←');
if (si == -1) throw new DomainError("argument `"+p+"` didn't contain a `←`");
String qk = p.substring(0, si);
String qv = p.substring(si+1);
global.set(qk, exec(qv, global));
} else {
throw new DomainError("Unknown command-line argument " + p);
}
66 changes: 35 additions & 31 deletions src/APL/Scope.java
Original file line number Diff line number Diff line change
@@ -39,42 +39,44 @@ private Scope owner(String name) {
else return parent.owner(name);
}

public void update (String name, Obj val) { // sets wherever var already exists
public void update(String name, Obj val) { // sets wherever var already exists
Scope sc = owner(name);
if (sc == null) sc = this;
sc.set(name, val);
}
public void set (String name, Obj val) { // sets in current scope
switch (name) {
case "⎕IO":
int tIO = ((Value) val).asInt();
if (tIO != 0 && tIO != 1) throw new DomainError("⎕IO should be 0 or 1", val);
IO = tIO;
nIO = IO==0? Num.ZERO : Num.ONE;
break;
case "⎕BOXSIMPLE":
Main.enclosePrimitives = ((Value) val).asInt() == 1;
break;
case "⎕VI":
Main.vind = Main.bool(val);
break;
case "⎕RL":
rnd = new Random(((Value) val).asInt());
break;
case "⎕PP":
if (val instanceof Primitive) {
Num.setPrecision(((Value) val).asInt());
} else {
int[] args = ((Value) val).asIntVec();
if (args.length == 3) Num.setPrecision(args[0], args[1], args[2]);
else throw new DomainError("⎕PP expected either a scalar number or array of 3 integers as ⍵", val);
}
break;
default:
vars.put(name, val);
}
public void set(String name, Obj val) { // sets in current scope
if (name.charAt(0) == '⎕') {
switch (name) {
case "⎕IO":
int tIO = ((Value) val).asInt();
if (tIO != 0 && tIO != 1) throw new DomainError("⎕IO should be 0 or 1", val);
IO = tIO;
nIO = IO==0? Num.ZERO : Num.ONE;
break;
case "⎕BOXSIMPLE":
Main.enclosePrimitives = ((Value) val).asInt() == 1;
break;
case "⎕VI":
Main.vind = Main.bool(val);
break;
case "⎕RL":
rnd = new Random(((Value) val).asInt());
break;
case "⎕PP":
if (val instanceof Primitive) {
Num.setPrecision(((Value) val).asInt());
} else {
int[] args = ((Value) val).asIntVec();
if (args.length == 3) Num.setPrecision(args[0], args[1], args[2]);
else throw new DomainError("⎕PP expected either a scalar number or array of 3 integers as ⍵", val);
}
break;
default:
throw new DomainError("setting unknown quad "+name);
}
} else vars.put(name, val);
}
public Obj get (String name) {
public Obj get(String name) {
if (name.startsWith("⎕")) {
switch (name) {
case "⎕MILLIS": return new Num(System.currentTimeMillis() - Main.startingMillis);
@@ -99,6 +101,8 @@ public Obj get (String name) {
case "⎕UCS": return new UCS(this);
case "⎕HASH": return new Hasher();
case "⎕IO": return nIO;
case "⎕VI": return Main.vind? Num.ONE : Num.ZERO;
case "⎕BOXSIMPLE": return Main.enclosePrimitives? Num.ONE : Num.ZERO;
case "⎕CLASS": return new ClassGetter();
case "⎕PP": return new DoubleArr(new double[] {Num.pp, Num.sEr, Num.eEr});
case "⎕PFX": return new Profiler(this);

0 comments on commit b082a57

Please sign in to comment.