diff --git a/src/com/jsaasta/froj/Interpreter.java b/src/com/jsaasta/froj/Interpreter.java index 3534b35..9ccf60f 100644 --- a/src/com/jsaasta/froj/Interpreter.java +++ b/src/com/jsaasta/froj/Interpreter.java @@ -1,5 +1,9 @@ package com.jsaasta.froj; +import com.jsaasta.froj.stdlib.Clock; +import com.jsaasta.froj.stdlib.Input; +import com.jsaasta.froj.stdlib.Stdlib; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -12,23 +16,7 @@ public class Interpreter implements Expr.Visitor, Stmt.Visitor { private Environment environment = globals; public Interpreter() { - globals.define("clock", new FrojCallable() { - @Override - public int arity() { - return 0; - } - - @Override - public Object call(Interpreter interpreter, List arguments) { - return (double) System.currentTimeMillis() / 1000.0; - } - - @Override - public String toString() { - return ""; - } - - }); + Stdlib.define().forEach(globals::define); } public void interpret(List statements) { diff --git a/src/com/jsaasta/froj/stdlib/Clock.java b/src/com/jsaasta/froj/stdlib/Clock.java new file mode 100644 index 0000000..6029868 --- /dev/null +++ b/src/com/jsaasta/froj/stdlib/Clock.java @@ -0,0 +1,25 @@ +package com.jsaasta.froj.stdlib; + +import com.jsaasta.froj.FrojCallable; +import com.jsaasta.froj.Interpreter; + +import java.util.List; + +public class Clock implements FrojCallable { + + @Override + public int arity() { + return 0; + } + + @Override + public Object call(Interpreter interpreter, List arguments) { + return (double) System.currentTimeMillis() / 1000.0; + } + + @Override + public String toString() { + return ""; + } + +} diff --git a/src/com/jsaasta/froj/stdlib/Input.java b/src/com/jsaasta/froj/stdlib/Input.java new file mode 100644 index 0000000..42e0616 --- /dev/null +++ b/src/com/jsaasta/froj/stdlib/Input.java @@ -0,0 +1,37 @@ +package com.jsaasta.froj.stdlib; + +import com.jsaasta.froj.FrojCallable; +import com.jsaasta.froj.Interpreter; +import com.jsaasta.froj.RuntimeError; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.List; + +public class Input implements FrojCallable { + + @Override + public int arity() { + return 0; + } + + @Override + public Object call(Interpreter interpreter, List arguments) { + InputStreamReader input = new InputStreamReader(System.in); + BufferedReader reader = new BufferedReader(input); + System.out.print("> "); + try { + String line = reader.readLine(); + return line; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public String toString() { + return ""; + } + +} diff --git a/src/com/jsaasta/froj/stdlib/Stdlib.java b/src/com/jsaasta/froj/stdlib/Stdlib.java new file mode 100644 index 0000000..4ce8c58 --- /dev/null +++ b/src/com/jsaasta/froj/stdlib/Stdlib.java @@ -0,0 +1,19 @@ +package com.jsaasta.froj.stdlib; + +import java.util.HashMap; +import java.util.Map; + +public class Stdlib { + + private static final Map classes; + + static { + classes = new HashMap<>(); + classes.put("clock", new Clock()); + classes.put("input", new Input()); + } + + public static Map define(){ + return classes; + } +}