aboutsummaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-16 23:57:50 -0500
committerJoel Martin <github@martintribe.org>2014-04-16 23:57:50 -0500
commit8cb5cda46cf3aef847ae3926dc53a5e5f87fe261 (patch)
tree13e5b2878f19ee24272ead8a92a9cb84b33ad0e5 /java/src
parenta05f7822b10ed4cdd61ed8384299a003baf1c1c6 (diff)
downloadmal-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.java45
-rw-r--r--java/src/main/java/mal/step2_eval.java54
-rw-r--r--java/src/main/java/mal/step3_env.java40
-rw-r--r--java/src/main/java/mal/step4_if_fn_do.java8
-rw-r--r--java/src/main/java/mal/step5_tco.java8
-rw-r--r--java/src/main/java/mal/step6_file.java36
-rw-r--r--java/src/main/java/mal/step7_quote.java36
-rw-r--r--java/src/main/java/mal/step8_macros.java38
-rw-r--r--java/src/main/java/mal/stepA_more.java50
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")) {