diff options
| author | Joel Martin <github@martintribe.org> | 2014-04-16 23:57:50 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-04-16 23:57:50 -0500 |
| commit | 8cb5cda46cf3aef847ae3926dc53a5e5f87fe261 (patch) | |
| tree | 13e5b2878f19ee24272ead8a92a9cb84b33ad0e5 /java/src | |
| parent | a05f7822b10ed4cdd61ed8384299a003baf1c1c6 (diff) | |
| download | mal-8cb5cda46cf3aef847ae3926dc53a5e5f87fe261.tar.gz mal-8cb5cda46cf3aef847ae3926dc53a5e5f87fe261.zip | |
All: move some fns to core. Major cleanup.
- Don't import/require core until step4.
- Define cond/or macros from step8
Diffstat (limited to 'java/src')
| -rw-r--r-- | java/src/main/java/mal/core.java | 45 | ||||
| -rw-r--r-- | java/src/main/java/mal/step2_eval.java | 54 | ||||
| -rw-r--r-- | java/src/main/java/mal/step3_env.java | 40 | ||||
| -rw-r--r-- | java/src/main/java/mal/step4_if_fn_do.java | 8 | ||||
| -rw-r--r-- | java/src/main/java/mal/step5_tco.java | 8 | ||||
| -rw-r--r-- | java/src/main/java/mal/step6_file.java | 36 | ||||
| -rw-r--r-- | java/src/main/java/mal/step7_quote.java | 36 | ||||
| -rw-r--r-- | java/src/main/java/mal/step8_macros.java | 38 | ||||
| -rw-r--r-- | java/src/main/java/mal/stepA_more.java | 50 |
9 files changed, 129 insertions, 186 deletions
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")) { |
