From 8adb082743f12402d0817018ab1e8ff0c0e4729e Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Sun, 13 Apr 2014 15:36:02 -0500 Subject: Java, JS: cleanup and sync steps. - Java: less direct use of obj.value attribute. --- java/src/main/java/mal/core.java | 60 +++++++++++++++----------------- java/src/main/java/mal/step5_tco.java | 2 +- java/src/main/java/mal/step6_file.java | 6 +++- java/src/main/java/mal/step7_quote.java | 6 +++- java/src/main/java/mal/step8_macros.java | 8 +++-- java/src/main/java/mal/stepA_more.java | 2 +- java/src/main/java/mal/types.java | 3 ++ 7 files changed, 50 insertions(+), 37 deletions(-) (limited to 'java/src') diff --git a/java/src/main/java/mal/core.java b/java/src/main/java/mal/core.java index 3200c0e..e1e6705 100644 --- a/java/src/main/java/mal/core.java +++ b/java/src/main/java/mal/core.java @@ -162,9 +162,7 @@ public class core { } }; - // - // Hash map operations - // + // HashMap functions static MalFunction new_hash_map = new MalFunction() { public MalVal apply(MalList a) throws MalThrowable { return new MalHashMap(a); @@ -271,42 +269,22 @@ public class core { static MalFunction cons = new MalFunction() { public MalVal apply(MalList a) throws MalThrowable { - MalList lst = new MalList(); - lst.value.addAll(((MalList)a.nth(1)).value); - lst.value.add(0, a.nth(0)); - return (MalVal) lst; + List lst = new ArrayList(); + lst.add(a.nth(0)); + lst.addAll(((MalList)a.nth(1)).getList()); + return (MalVal)new MalList(lst); } }; static MalFunction concat = new MalFunction() { public MalVal apply(MalList a) throws MalThrowable { if (a.size() == 0) { return new MalList(); } - MalList lst = new MalList(); - lst.value.addAll(((MalList)a.nth(0)).value); + List lst = new ArrayList(); + lst.addAll(((MalList)a.nth(0)).value); for(Integer i=1; i Date: Tue, 15 Apr 2014 01:24:43 -0500 Subject: All: fix get. All pass stepA tests. --- java/src/main/java/mal/core.java | 16 ++++++++++------ java/src/main/java/mal/step6_file.java | 2 +- java/src/main/java/mal/step7_quote.java | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) (limited to 'java/src') diff --git a/java/src/main/java/mal/core.java b/java/src/main/java/mal/core.java index e1e6705..6ac4f8e 100644 --- a/java/src/main/java/mal/core.java +++ b/java/src/main/java/mal/core.java @@ -205,13 +205,17 @@ public class core { static MalFunction get = new MalFunction() { public MalVal apply(MalList a) throws MalThrowable { - String key = ((MalString)a.nth(1)).getValue(); - MalHashMap mhm = (MalHashMap)a.nth(0); - HashMap hm = (HashMap)mhm.value; - if (hm.containsKey(key)) { - return hm.get(key); - } else { + if (a.nth(0) == Nil) { return Nil; + } else { + String key = ((MalString)a.nth(1)).getValue(); + MalHashMap mhm = (MalHashMap)a.nth(0); + HashMap hm = (HashMap)mhm.value; + if (hm.containsKey(key)) { + return hm.get(key); + } else { + return Nil; + } } } }; diff --git a/java/src/main/java/mal/step6_file.java b/java/src/main/java/mal/step6_file.java index 8d05b50..6a4c981 100644 --- a/java/src/main/java/mal/step6_file.java +++ b/java/src/main/java/mal/step6_file.java @@ -161,7 +161,7 @@ public class step6_file { return reader.read_str(((MalString)args.nth(0)).getValue()); } catch (MalContinue c) { return types.Nil; - return reader.read_str(((MalString)args.nth(0)).getValue()); + } } }); _ref(repl_env, "eval", new MalFunction() { diff --git a/java/src/main/java/mal/step7_quote.java b/java/src/main/java/mal/step7_quote.java index fbebb10..c46b4f0 100644 --- a/java/src/main/java/mal/step7_quote.java +++ b/java/src/main/java/mal/step7_quote.java @@ -192,7 +192,7 @@ public class step7_quote { return reader.read_str(((MalString)args.nth(0)).getValue()); } catch (MalContinue c) { return types.Nil; - return reader.read_str(((MalString)args.nth(0)).getValue()); + } } }); _ref(repl_env, "eval", new MalFunction() { -- cgit v1.2.3 From 8cb5cda46cf3aef847ae3926dc53a5e5f87fe261 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Wed, 16 Apr 2014 23:57:50 -0500 Subject: All: move some fns to core. Major cleanup. - Don't import/require core until step4. - Define cond/or macros from step8 --- java/src/main/java/mal/core.java | 45 +++++++++++++++++++++++++ java/src/main/java/mal/step2_eval.java | 54 +++++++++++++----------------- java/src/main/java/mal/step3_env.java | 40 ++++++++++++++++------ java/src/main/java/mal/step4_if_fn_do.java | 8 ++--- java/src/main/java/mal/step5_tco.java | 8 ++--- java/src/main/java/mal/step6_file.java | 36 +++----------------- java/src/main/java/mal/step7_quote.java | 36 +++----------------- java/src/main/java/mal/step8_macros.java | 38 ++++----------------- java/src/main/java/mal/stepA_more.java | 50 ++++----------------------- 9 files changed, 129 insertions(+), 186 deletions(-) (limited to 'java/src') diff --git a/java/src/main/java/mal/core.java b/java/src/main/java/mal/core.java index 6ac4f8e..ea6787d 100644 --- a/java/src/main/java/mal/core.java +++ b/java/src/main/java/mal/core.java @@ -7,8 +7,14 @@ import java.util.Map; import java.util.HashMap; import com.google.common.collect.ImmutableMap; +import java.io.IOException; +import java.io.FileNotFoundException; +import java.util.Scanner; +import java.io.File; + import mal.types.*; import mal.printer; +import mal.readline; public class core { // Local references for convenience @@ -84,6 +90,41 @@ public class core { } }; + static MalFunction mal_readline = new MalFunction() { + public MalVal apply(MalList args) throws MalThrowable { + String prompt = ((MalString)args.nth(0)).getValue(); + try { + return new MalString(readline.readline(prompt)); + } catch (IOException e) { + throw new MalException(new MalString(e.getMessage())); + } catch (readline.EOFException e) { + throw new MalException(new MalString(e.getMessage())); + } + } + }; + + static MalFunction read_string = new MalFunction() { + public MalVal apply(MalList args) throws MalThrowable { + try { + return reader.read_str(((MalString)args.nth(0)).getValue()); + } catch (MalContinue c) { + return types.Nil; + } + } + }; + + static MalFunction slurp = new MalFunction() { + public MalVal apply(MalList args) throws MalThrowable { + String fname = ((MalString)args.nth(0)).getValue(); + try { + return new MalString( + new Scanner(new File(fname)).useDelimiter("\\Z").next()); + } catch (FileNotFoundException e) { + throw new MalError(e.getMessage()); + } + } + }; + // Number functions static MalFunction add = new MalFunction() { @@ -423,10 +464,14 @@ public class core { .put("true?", true_Q) .put("false?", false_Q) .put("symbol?", symbol_Q) + .put("pr-str", pr_str) .put("str", str) .put("prn", prn) .put("println", println) + .put("readline", mal_readline) + .put("read-string", read_string) + .put("slurp", slurp) .put("<", lt) .put("<=", lte) .put(">", gt) diff --git a/java/src/main/java/mal/step2_eval.java b/java/src/main/java/mal/step2_eval.java index 3d425db..cc2b785 100644 --- a/java/src/main/java/mal/step2_eval.java +++ b/java/src/main/java/mal/step2_eval.java @@ -77,42 +77,36 @@ public class step2_eval { return EVAL(READ(str), env); } - static interface ILambda { - public MalVal apply(MalList args); - } - static class plus implements ILambda { - public MalVal apply(MalList args) { - return ((MalInteger)args.nth(0)).add( - ((MalInteger)args.nth(1))); + static MalFunction add = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return ((MalInteger)a.nth(0)).add((MalInteger)a.nth(1)); } - } - static class minus implements ILambda { - public MalVal apply(MalList args) { - return ((MalInteger)args.nth(0)).subtract( - ((MalInteger)args.nth(1))); + }; + static MalFunction subtract = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return ((MalInteger)a.nth(0)).subtract((MalInteger)a.nth(1)); } - } - static class multiply implements ILambda { - public MalVal apply(MalList args) { - return ((MalInteger)args.nth(0)).multiply( - ((MalInteger)args.nth(1))); + }; + static MalFunction multiply = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return ((MalInteger)a.nth(0)).multiply((MalInteger)a.nth(1)); } - } - static class divide implements ILambda { - public MalVal apply(MalList args) { - return ((MalInteger)args.nth(0)).divide( - ((MalInteger)args.nth(1))); + }; + static MalFunction divide = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return ((MalInteger)a.nth(0)).divide((MalInteger)a.nth(1)); } - } + }; + public static void main(String[] args) throws MalThrowable { String prompt = "user> "; HashMap repl_env = new HashMap(); - repl_env.put("+", new plus()); - repl_env.put("-", new minus()); - repl_env.put("*", new multiply()); - repl_env.put("/", new divide()); + repl_env.put("+", add); + repl_env.put("-", subtract); + repl_env.put("*", multiply); + repl_env.put("/", divide); if (args.length > 0 && args[0].equals("--raw")) { readline.mode = readline.Mode.JAVA; @@ -132,12 +126,12 @@ public class step2_eval { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (MalError e) { - System.out.println("Error: " + e.getMessage()); - continue; } catch (reader.ParseError e) { System.out.println(e.getMessage()); continue; + } catch (MalError e) { + System.out.println("Error: " + e.getMessage()); + continue; } } } diff --git a/java/src/main/java/mal/step3_env.java b/java/src/main/java/mal/step3_env.java index 690469e..297453c 100644 --- a/java/src/main/java/mal/step3_env.java +++ b/java/src/main/java/mal/step3_env.java @@ -11,7 +11,6 @@ import mal.readline; import mal.reader; import mal.printer; import mal.env.Env; -import mal.core; public class step3_env { // read @@ -97,18 +96,37 @@ public class step3_env { public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } - public static Env _ref(Env env, String name, MalVal mv) { - return env.set(name, mv); - } + + static MalFunction add = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return ((MalInteger)a.nth(0)).add((MalInteger)a.nth(1)); + } + }; + static MalFunction subtract = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return ((MalInteger)a.nth(0)).subtract((MalInteger)a.nth(1)); + } + }; + static MalFunction multiply = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return ((MalInteger)a.nth(0)).multiply((MalInteger)a.nth(1)); + } + }; + static MalFunction divide = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return ((MalInteger)a.nth(0)).divide((MalInteger)a.nth(1)); + } + }; + public static void main(String[] args) throws MalThrowable { String prompt = "user> "; Env repl_env = new Env(null); - _ref(repl_env, "+", core.add); - _ref(repl_env, "-", core.subtract); - _ref(repl_env, "*", core.multiply); - _ref(repl_env, "/", core.divide); + repl_env.set("+", add); + repl_env.set("-", subtract); + repl_env.set("*", multiply); + repl_env.set("/", divide); if (args.length > 0 && args[0].equals("--raw")) { readline.mode = readline.Mode.JAVA; @@ -128,12 +146,12 @@ public class step3_env { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (MalError e) { - System.out.println("Error: " + e.getMessage()); - continue; } catch (reader.ParseError e) { System.out.println(e.getMessage()); continue; + } catch (MalError e) { + System.out.println("Error: " + e.getMessage()); + continue; } } } diff --git a/java/src/main/java/mal/step4_if_fn_do.java b/java/src/main/java/mal/step4_if_fn_do.java index 4d064cf..6e7997a 100644 --- a/java/src/main/java/mal/step4_if_fn_do.java +++ b/java/src/main/java/mal/step4_if_fn_do.java @@ -122,18 +122,18 @@ public class step4_if_fn_do { public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } - public static Env _ref(Env env, String name, MalVal mv) { - return env.set(name, mv); - } public static void main(String[] args) throws MalThrowable { String prompt = "user> "; Env repl_env = new Env(null); + + // core.java: defined using Java for (String key : core.ns.keySet()) { - _ref(repl_env, key, core.ns.get(key)); + repl_env.set(key, core.ns.get(key)); } + // core.mal: defined using the language itself RE(repl_env, "(def! not (fn* (a) (if a false true)))"); if (args.length > 0 && args[0].equals("--raw")) { diff --git a/java/src/main/java/mal/step5_tco.java b/java/src/main/java/mal/step5_tco.java index 9cd42d5..ad15d74 100644 --- a/java/src/main/java/mal/step5_tco.java +++ b/java/src/main/java/mal/step5_tco.java @@ -133,18 +133,18 @@ public class step5_tco { public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } - public static Env _ref(Env env, String name, MalVal mv) { - return env.set(name, mv); - } public static void main(String[] args) throws MalThrowable { String prompt = "user> "; Env repl_env = new Env(null); + + // core.java: defined using Java for (String key : core.ns.keySet()) { - _ref(repl_env, key, core.ns.get(key)); + repl_env.set(key, core.ns.get(key)); } + // core.mal: defined using the language itself RE(repl_env, "(def! not (fn* (a) (if a false true)))"); if (args.length > 0 && args[0].equals("--raw")) { diff --git a/java/src/main/java/mal/step6_file.java b/java/src/main/java/mal/step6_file.java index 6a4c981..446ffa0 100644 --- a/java/src/main/java/mal/step6_file.java +++ b/java/src/main/java/mal/step6_file.java @@ -1,10 +1,7 @@ package mal; import java.io.IOException; -import java.io.FileNotFoundException; -import java.util.Scanner; -import java.io.File; import java.util.List; import java.util.Map; import java.util.HashMap; @@ -136,46 +133,23 @@ public class step6_file { public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } - public static Env _ref(Env env, String name, MalVal mv) { - return env.set(name, mv); - } - public static String slurp(String fname) throws MalThrowable { - try { - return new Scanner(new File(fname)) - .useDelimiter("\\Z").next(); - } catch (FileNotFoundException e) { - throw new MalError(e.getMessage()); - } - } public static void main(String[] args) throws MalThrowable { String prompt = "user> "; final Env repl_env = new Env(null); + + // core.java: defined using Java for (String key : core.ns.keySet()) { - _ref(repl_env, key, core.ns.get(key)); + repl_env.set(key, core.ns.get(key)); } - _ref(repl_env, "read-string", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - try { - return reader.read_str(((MalString)args.nth(0)).getValue()); - } catch (MalContinue c) { - return types.Nil; - } - } - }); - _ref(repl_env, "eval", new MalFunction() { + repl_env.set("eval", new MalFunction() { public MalVal apply(MalList args) throws MalThrowable { return EVAL(args.nth(0), repl_env); } }); - _ref(repl_env, "slurp", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - String fname = ((MalString)args.nth(0)).getValue(); - return new MalString(slurp(fname)); - } - }); + // core.mal: defined using the language itself RE(repl_env, "(def! not (fn* (a) (if a false true)))"); RE(repl_env, "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))"); diff --git a/java/src/main/java/mal/step7_quote.java b/java/src/main/java/mal/step7_quote.java index c46b4f0..2f5a638 100644 --- a/java/src/main/java/mal/step7_quote.java +++ b/java/src/main/java/mal/step7_quote.java @@ -1,10 +1,7 @@ package mal; import java.io.IOException; -import java.io.FileNotFoundException; -import java.util.Scanner; -import java.io.File; import java.util.List; import java.util.Map; import java.util.HashMap; @@ -167,46 +164,23 @@ public class step7_quote { public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } - public static Env _ref(Env env, String name, MalVal mv) { - return env.set(name, mv); - } - public static String slurp(String fname) throws MalThrowable { - try { - return new Scanner(new File(fname)) - .useDelimiter("\\Z").next(); - } catch (FileNotFoundException e) { - throw new MalError(e.getMessage()); - } - } public static void main(String[] args) throws MalThrowable { String prompt = "user> "; final Env repl_env = new Env(null); + + // core.java: defined using Java for (String key : core.ns.keySet()) { - _ref(repl_env, key, core.ns.get(key)); + repl_env.set(key, core.ns.get(key)); } - _ref(repl_env, "read-string", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - try { - return reader.read_str(((MalString)args.nth(0)).getValue()); - } catch (MalContinue c) { - return types.Nil; - } - } - }); - _ref(repl_env, "eval", new MalFunction() { + repl_env.set("eval", new MalFunction() { public MalVal apply(MalList args) throws MalThrowable { return EVAL(args.nth(0), repl_env); } }); - _ref(repl_env, "slurp", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - String fname = ((MalString)args.nth(0)).getValue(); - return new MalString(slurp(fname)); - } - }); + // core.mal: defined using the language itself RE(repl_env, "(def! not (fn* (a) (if a false true)))"); RE(repl_env, "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))"); diff --git a/java/src/main/java/mal/step8_macros.java b/java/src/main/java/mal/step8_macros.java index bb99818..914c7d3 100644 --- a/java/src/main/java/mal/step8_macros.java +++ b/java/src/main/java/mal/step8_macros.java @@ -1,10 +1,7 @@ package mal; import java.io.IOException; -import java.io.FileNotFoundException; -import java.util.Scanner; -import java.io.File; import java.util.List; import java.util.Map; import java.util.HashMap; @@ -205,48 +202,27 @@ public class step8_macros { public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } - public static Env _ref(Env env, String name, MalVal mv) { - return env.set(name, mv); - } - public static String slurp(String fname) throws MalThrowable { - try { - return new Scanner(new File(fname)) - .useDelimiter("\\Z").next(); - } catch (FileNotFoundException e) { - throw new MalError(e.getMessage()); - } - } public static void main(String[] args) throws MalThrowable { String prompt = "user> "; final Env repl_env = new Env(null); + + // core.java: defined using Java for (String key : core.ns.keySet()) { - _ref(repl_env, key, core.ns.get(key)); + repl_env.set(key, core.ns.get(key)); } - _ref(repl_env, "read-string", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - try { - return reader.read_str(((MalString)args.nth(0)).getValue()); - } catch (MalContinue c) { - return types.Nil; - } - } - }); - _ref(repl_env, "eval", new MalFunction() { + repl_env.set("eval", new MalFunction() { public MalVal apply(MalList args) throws MalThrowable { return EVAL(args.nth(0), repl_env); } }); - _ref(repl_env, "slurp", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - String fname = ((MalString)args.nth(0)).getValue(); - return new MalString(slurp(fname)); - } - }); + // core.mal: defined using the language itself RE(repl_env, "(def! not (fn* (a) (if a false true)))"); RE(repl_env, "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))"); + RE(repl_env, "(defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw \"odd number of forms to cond\")) (cons 'cond (rest (rest xs)))))))"); + RE(repl_env, "(defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) `(let* (or_FIXME ~(first xs)) (if or_FIXME or_FIXME (or ~@(rest xs))))))))"); Integer fileIdx = 0; if (args.length > 0 && args[0].equals("--raw")) { diff --git a/java/src/main/java/mal/stepA_more.java b/java/src/main/java/mal/stepA_more.java index 76b8501..5ed5667 100644 --- a/java/src/main/java/mal/stepA_more.java +++ b/java/src/main/java/mal/stepA_more.java @@ -1,10 +1,7 @@ package mal; import java.io.IOException; -import java.io.FileNotFoundException; -import java.util.Scanner; -import java.io.File; import java.io.StringWriter; import java.io.PrintWriter; import java.util.List; @@ -231,62 +228,27 @@ public class stepA_more { public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } - public static Env _ref(Env env, String name, MalVal mv) { - return env.set(name, mv); - } - public static String slurp(String fname) throws MalThrowable { - try { - return new Scanner(new File(fname)) - .useDelimiter("\\Z").next(); - } catch (FileNotFoundException e) { - throw new MalError(e.getMessage()); - } - } public static void main(String[] args) throws MalThrowable { String prompt = "user> "; final Env repl_env = new Env(null); + + // core.java: defined using Java for (String key : core.ns.keySet()) { - _ref(repl_env, key, core.ns.get(key)); + repl_env.set(key, core.ns.get(key)); } - _ref(repl_env, "readline", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - String prompt = ((MalString)args.nth(0)).getValue(); - try { - return new MalString(readline.readline(prompt)); - } catch (IOException e) { - throw new MalException(new MalString(e.getMessage())); - } catch (readline.EOFException e) { - throw new MalException(new MalString(e.getMessage())); - } - } - }); - _ref(repl_env, "read-string", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - try { - return reader.read_str(((MalString)args.nth(0)).getValue()); - } catch (MalContinue c) { - return types.Nil; - } - } - }); - _ref(repl_env, "eval", new MalFunction() { + repl_env.set("eval", new MalFunction() { public MalVal apply(MalList args) throws MalThrowable { return EVAL(args.nth(0), repl_env); } }); - _ref(repl_env, "slurp", new MalFunction() { - public MalVal apply(MalList args) throws MalThrowable { - String fname = ((MalString)args.nth(0)).getValue(); - return new MalString(slurp(fname)); - } - }); + // core.mal: defined using the language itself RE(repl_env, "(def! not (fn* (a) (if a false true)))"); + RE(repl_env, "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))"); RE(repl_env, "(defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw \"odd number of forms to cond\")) (cons 'cond (rest (rest xs)))))))"); RE(repl_env, "(defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) `(let* (or_FIXME ~(first xs)) (if or_FIXME or_FIXME (or ~@(rest xs))))))))"); - RE(repl_env, "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))"); Integer fileIdx = 0; if (args.length > 0 && args[0].equals("--raw")) { -- cgit v1.2.3 From db4c329aff4621e05b92a55be4f18173f5a4f655 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Thu, 17 Apr 2014 21:49:07 -0500 Subject: All: perf test, Makefile refactor, add *host-language* Other: - bash,make,postscript: quasiquote of vectors - Fix Java slurp - add time function to core.mal - switches on *host-language* for make time-secs vs time-ms - Ignore */experiments directories --- java/src/main/java/mal/core.java | 11 ++++++++++- java/src/main/java/mal/stepA_more.java | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) (limited to 'java/src') diff --git a/java/src/main/java/mal/core.java b/java/src/main/java/mal/core.java index ea6787d..0f1d226 100644 --- a/java/src/main/java/mal/core.java +++ b/java/src/main/java/mal/core.java @@ -117,8 +117,10 @@ public class core { public MalVal apply(MalList args) throws MalThrowable { String fname = ((MalString)args.nth(0)).getValue(); try { + // Scanner drops final newline, so add it back return new MalString( - new Scanner(new File(fname)).useDelimiter("\\Z").next()); + new Scanner(new File(fname)).useDelimiter("\\Z").next() + + "\n"); } catch (FileNotFoundException e) { throw new MalError(e.getMessage()); } @@ -169,6 +171,12 @@ public class core { } }; + static MalFunction time_ms = new MalFunction() { + public MalVal apply(MalList a) throws MalThrowable { + return new MalInteger((int)System.currentTimeMillis()); + } + }; + // List functions static MalFunction new_list = new MalFunction() { @@ -480,6 +488,7 @@ public class core { .put("-", subtract) .put("*", multiply) .put("/", divide) + .put("time-ms", time_ms) .put("list", new_list) .put("list?", list_Q) diff --git a/java/src/main/java/mal/stepA_more.java b/java/src/main/java/mal/stepA_more.java index 5ed5667..17bdb16 100644 --- a/java/src/main/java/mal/stepA_more.java +++ b/java/src/main/java/mal/stepA_more.java @@ -245,6 +245,7 @@ public class stepA_more { }); // core.mal: defined using the language itself + RE(repl_env, "(def! *host-language* \"java\")"); RE(repl_env, "(def! not (fn* (a) (if a false true)))"); RE(repl_env, "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))"); RE(repl_env, "(defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw \"odd number of forms to cond\")) (cons 'cond (rest (rest xs)))))))"); -- cgit v1.2.3 From 86b689f3d7111a9fa13da389a30f3dfdf877d1a4 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Sat, 19 Apr 2014 13:04:09 -0500 Subject: All: *ARGV* and *host-language*. Misc syncing/fixes. --- java/src/main/java/mal/step0_repl.java | 2 +- java/src/main/java/mal/step1_read_print.java | 2 +- java/src/main/java/mal/step2_eval.java | 2 +- java/src/main/java/mal/step3_env.java | 2 +- java/src/main/java/mal/step4_if_fn_do.java | 2 +- java/src/main/java/mal/step5_tco.java | 2 +- java/src/main/java/mal/step6_file.java | 12 ++++++++---- java/src/main/java/mal/step7_quote.java | 12 ++++++++---- java/src/main/java/mal/step8_macros.java | 12 ++++++++---- java/src/main/java/mal/stepA_more.java | 15 +++++++++++---- 10 files changed, 41 insertions(+), 22 deletions(-) (limited to 'java/src') diff --git a/java/src/main/java/mal/step0_repl.java b/java/src/main/java/mal/step0_repl.java index 9095aca..060f43e 100644 --- a/java/src/main/java/mal/step0_repl.java +++ b/java/src/main/java/mal/step0_repl.java @@ -20,7 +20,7 @@ public class step0_repl { return exp; } - // REPL + // repl public static String RE(String env, String str) { return EVAL(READ(str), env); } diff --git a/java/src/main/java/mal/step1_read_print.java b/java/src/main/java/mal/step1_read_print.java index 3f7e3fb..2c029aa 100644 --- a/java/src/main/java/mal/step1_read_print.java +++ b/java/src/main/java/mal/step1_read_print.java @@ -23,7 +23,7 @@ public class step1_read_print { return printer._pr_str(exp, true); } - // REPL + // repl public static MalVal RE(String env, String str) throws MalThrowable { return EVAL(READ(str), env); } diff --git a/java/src/main/java/mal/step2_eval.java b/java/src/main/java/mal/step2_eval.java index cc2b785..ee8ea26 100644 --- a/java/src/main/java/mal/step2_eval.java +++ b/java/src/main/java/mal/step2_eval.java @@ -72,7 +72,7 @@ public class step2_eval { return printer._pr_str(exp, true); } - // REPL + // repl public static MalVal RE(HashMap env, String str) throws MalThrowable { return EVAL(READ(str), env); } diff --git a/java/src/main/java/mal/step3_env.java b/java/src/main/java/mal/step3_env.java index 297453c..0bf5c16 100644 --- a/java/src/main/java/mal/step3_env.java +++ b/java/src/main/java/mal/step3_env.java @@ -92,7 +92,7 @@ public class step3_env { return printer._pr_str(exp, true); } - // REPL + // repl public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } diff --git a/java/src/main/java/mal/step4_if_fn_do.java b/java/src/main/java/mal/step4_if_fn_do.java index 6e7997a..9a66542 100644 --- a/java/src/main/java/mal/step4_if_fn_do.java +++ b/java/src/main/java/mal/step4_if_fn_do.java @@ -118,7 +118,7 @@ public class step4_if_fn_do { return printer._pr_str(exp, true); } - // REPL + // repl public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } diff --git a/java/src/main/java/mal/step5_tco.java b/java/src/main/java/mal/step5_tco.java index ad15d74..dd1dc89 100644 --- a/java/src/main/java/mal/step5_tco.java +++ b/java/src/main/java/mal/step5_tco.java @@ -129,7 +129,7 @@ public class step5_tco { return printer._pr_str(exp, true); } - // REPL + // repl public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } diff --git a/java/src/main/java/mal/step6_file.java b/java/src/main/java/mal/step6_file.java index 446ffa0..4bf0f0e 100644 --- a/java/src/main/java/mal/step6_file.java +++ b/java/src/main/java/mal/step6_file.java @@ -129,7 +129,7 @@ public class step6_file { return printer._pr_str(exp, true); } - // REPL + // repl public static MalVal RE(Env env, String str) throws MalThrowable { return EVAL(READ(str), env); } @@ -148,6 +148,12 @@ public class step6_file { return EVAL(args.nth(0), repl_env); } }); + MalList _argv = new MalList(); + for (Integer i=1; i < args.length; i++) { + _argv.conj_BANG(new MalString(args[i])); + } + repl_env.set("*ARGV*", _argv); + // core.mal: defined using the language itself RE(repl_env, "(def! not (fn* (a) (if a false true)))"); @@ -159,9 +165,7 @@ public class step6_file { fileIdx = 1; } if (args.length > fileIdx) { - for(Integer i=fileIdx; i fileIdx) { - for(Integer i=fileIdx; i fileIdx) { - for(Integer i=fileIdx; i fileIdx) { - for(Integer i=fileIdx; i Date: Wed, 23 Apr 2014 21:59:50 -0500 Subject: All: TCO let* and quasiquote. --- java/src/main/java/mal/step5_tco.java | 4 +++- java/src/main/java/mal/step6_file.java | 4 +++- java/src/main/java/mal/step7_quote.java | 7 +++++-- java/src/main/java/mal/step8_macros.java | 7 +++++-- java/src/main/java/mal/stepA_more.java | 7 +++++-- 5 files changed, 21 insertions(+), 8 deletions(-) (limited to 'java/src') diff --git a/java/src/main/java/mal/step5_tco.java b/java/src/main/java/mal/step5_tco.java index dd1dc89..aa3f7a7 100644 --- a/java/src/main/java/mal/step5_tco.java +++ b/java/src/main/java/mal/step5_tco.java @@ -80,7 +80,9 @@ public class step5_tco { val = ((MalList)a1).nth(i+1); let_env.set(key.getName(), EVAL(val, let_env)); } - return EVAL(a2, let_env); + orig_ast = a2; + env = let_env; + break; case "do": eval_ast(ast.slice(1, ast.size()-1), env); orig_ast = ast.nth(ast.size()-1); diff --git a/java/src/main/java/mal/step6_file.java b/java/src/main/java/mal/step6_file.java index 4bf0f0e..d3f4914 100644 --- a/java/src/main/java/mal/step6_file.java +++ b/java/src/main/java/mal/step6_file.java @@ -80,7 +80,9 @@ public class step6_file { val = ((MalList)a1).nth(i+1); let_env.set(key.getName(), EVAL(val, let_env)); } - return EVAL(a2, let_env); + orig_ast = a2; + env = let_env; + break; case "do": eval_ast(ast.slice(1, ast.size()-1), env); orig_ast = ast.nth(ast.size()-1); diff --git a/java/src/main/java/mal/step7_quote.java b/java/src/main/java/mal/step7_quote.java index da0781b..639f8b9 100644 --- a/java/src/main/java/mal/step7_quote.java +++ b/java/src/main/java/mal/step7_quote.java @@ -107,11 +107,14 @@ public class step7_quote { val = ((MalList)a1).nth(i+1); let_env.set(key.getName(), EVAL(val, let_env)); } - return EVAL(a2, let_env); + orig_ast = a2; + env = let_env; + break; case "quote": return ast.nth(1); case "quasiquote": - return EVAL(quasiquote(ast.nth(1)), env); + orig_ast = quasiquote(ast.nth(1)); + break; case "do": eval_ast(ast.slice(1, ast.size()-1), env); orig_ast = ast.nth(ast.size()-1); diff --git a/java/src/main/java/mal/step8_macros.java b/java/src/main/java/mal/step8_macros.java index c4cb1de..fb3ffdc 100644 --- a/java/src/main/java/mal/step8_macros.java +++ b/java/src/main/java/mal/step8_macros.java @@ -135,11 +135,14 @@ public class step8_macros { val = ((MalList)a1).nth(i+1); let_env.set(key.getName(), EVAL(val, let_env)); } - return EVAL(a2, let_env); + orig_ast = a2; + env = let_env; + break; case "quote": return ast.nth(1); case "quasiquote": - return EVAL(quasiquote(ast.nth(1)), env); + orig_ast = quasiquote(ast.nth(1)); + break; case "defmacro!": a1 = ast.nth(1); a2 = ast.nth(2); diff --git a/java/src/main/java/mal/stepA_more.java b/java/src/main/java/mal/stepA_more.java index 20dee3f..75ec301 100644 --- a/java/src/main/java/mal/stepA_more.java +++ b/java/src/main/java/mal/stepA_more.java @@ -137,11 +137,14 @@ public class stepA_more { val = ((MalList)a1).nth(i+1); let_env.set(key.getName(), EVAL(val, let_env)); } - return EVAL(a2, let_env); + orig_ast = a2; + env = let_env; + break; case "quote": return ast.nth(1); case "quasiquote": - return EVAL(quasiquote(ast.nth(1)), env); + orig_ast = quasiquote(ast.nth(1)); + break; case "defmacro!": a1 = ast.nth(1); a2 = ast.nth(2); -- cgit v1.2.3 From cc021efe10380039a13da5300990639203450634 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Sun, 27 Apr 2014 17:58:48 -0500 Subject: Add step5/9 tests for impls that support it. - Also remove broken make/tests/*.mk tests. Not used any more. --- java/src/main/java/mal/step1_read_print.java | 8 ++++---- java/src/main/java/mal/step2_eval.java | 8 ++++---- java/src/main/java/mal/step3_env.java | 8 ++++---- java/src/main/java/mal/step4_if_fn_do.java | 6 +++--- java/src/main/java/mal/step5_tco.java | 6 +++--- java/src/main/java/mal/step6_file.java | 6 +++--- java/src/main/java/mal/step7_quote.java | 6 +++--- java/src/main/java/mal/step8_macros.java | 6 +++--- java/src/main/java/mal/stepA_more.java | 6 +++--- 9 files changed, 30 insertions(+), 30 deletions(-) (limited to 'java/src') diff --git a/java/src/main/java/mal/step1_read_print.java b/java/src/main/java/mal/step1_read_print.java index 2c029aa..e849052 100644 --- a/java/src/main/java/mal/step1_read_print.java +++ b/java/src/main/java/mal/step1_read_print.java @@ -49,11 +49,11 @@ public class step1_read_print { System.out.println(PRINT(RE(null, line))); } catch (MalContinue e) { continue; - } catch (MalError e) { - System.out.println("Error: " + e.getMessage()); + } catch (MalThrowable t) { + System.out.println("Error: " + t.getMessage()); continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); continue; } } diff --git a/java/src/main/java/mal/step2_eval.java b/java/src/main/java/mal/step2_eval.java index ee8ea26..6de69cd 100644 --- a/java/src/main/java/mal/step2_eval.java +++ b/java/src/main/java/mal/step2_eval.java @@ -126,11 +126,11 @@ public class step2_eval { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); + } catch (MalThrowable t) { + System.out.println("Error: " + t.getMessage()); continue; - } catch (MalError e) { - System.out.println("Error: " + e.getMessage()); + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); continue; } } diff --git a/java/src/main/java/mal/step3_env.java b/java/src/main/java/mal/step3_env.java index 0bf5c16..a88dc13 100644 --- a/java/src/main/java/mal/step3_env.java +++ b/java/src/main/java/mal/step3_env.java @@ -146,11 +146,11 @@ public class step3_env { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); + } catch (MalThrowable t) { + System.out.println("Error: " + t.getMessage()); continue; - } catch (MalError e) { - System.out.println("Error: " + e.getMessage()); + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); continue; } } diff --git a/java/src/main/java/mal/step4_if_fn_do.java b/java/src/main/java/mal/step4_if_fn_do.java index 9a66542..ce9043d 100644 --- a/java/src/main/java/mal/step4_if_fn_do.java +++ b/java/src/main/java/mal/step4_if_fn_do.java @@ -154,12 +154,12 @@ public class step4_if_fn_do { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); - continue; } catch (MalThrowable t) { System.out.println("Error: " + t.getMessage()); continue; + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); + continue; } } } diff --git a/java/src/main/java/mal/step5_tco.java b/java/src/main/java/mal/step5_tco.java index aa3f7a7..ef56083 100644 --- a/java/src/main/java/mal/step5_tco.java +++ b/java/src/main/java/mal/step5_tco.java @@ -167,12 +167,12 @@ public class step5_tco { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); - continue; } catch (MalThrowable t) { System.out.println("Error: " + t.getMessage()); continue; + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); + continue; } } } diff --git a/java/src/main/java/mal/step6_file.java b/java/src/main/java/mal/step6_file.java index d3f4914..56bcdf7 100644 --- a/java/src/main/java/mal/step6_file.java +++ b/java/src/main/java/mal/step6_file.java @@ -185,12 +185,12 @@ public class step6_file { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); - continue; } catch (MalThrowable t) { System.out.println("Error: " + t.getMessage()); continue; + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); + continue; } } } diff --git a/java/src/main/java/mal/step7_quote.java b/java/src/main/java/mal/step7_quote.java index 639f8b9..8c3766a 100644 --- a/java/src/main/java/mal/step7_quote.java +++ b/java/src/main/java/mal/step7_quote.java @@ -217,12 +217,12 @@ public class step7_quote { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); - continue; } catch (MalThrowable t) { System.out.println("Error: " + t.getMessage()); continue; + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); + continue; } } } diff --git a/java/src/main/java/mal/step8_macros.java b/java/src/main/java/mal/step8_macros.java index fb3ffdc..4c89356 100644 --- a/java/src/main/java/mal/step8_macros.java +++ b/java/src/main/java/mal/step8_macros.java @@ -257,12 +257,12 @@ public class step8_macros { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); - continue; } catch (MalThrowable t) { System.out.println("Error: " + t.getMessage()); continue; + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); + continue; } } } diff --git a/java/src/main/java/mal/stepA_more.java b/java/src/main/java/mal/stepA_more.java index 75ec301..7e869e6 100644 --- a/java/src/main/java/mal/stepA_more.java +++ b/java/src/main/java/mal/stepA_more.java @@ -287,15 +287,15 @@ public class stepA_more { System.out.println(PRINT(RE(repl_env, line))); } catch (MalContinue e) { continue; - } catch (reader.ParseError e) { - System.out.println(e.getMessage()); - continue; } catch (MalException e) { System.out.println("Error: " + printer._pr_str(e.getValue(), false)); continue; } catch (MalThrowable t) { System.out.println("Error: " + t.getMessage()); continue; + } catch (Throwable t) { + System.out.println("Uncaught " + t + ": " + t.getMessage()); + continue; } } } -- cgit v1.2.3