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;
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) \")\")))))");