diff --git a/src/main/java/serene/simple/DefSpecialForm.java b/src/main/java/serene/simple/DefSpecialForm.java index d6ba9a5..1e2b061 100644 --- a/src/main/java/serene/simple/DefSpecialForm.java +++ b/src/main/java/serene/simple/DefSpecialForm.java @@ -1,7 +1,7 @@ package serene.simple; public class DefSpecialForm extends SpecialForm { - public DefSpecialForm(ListNode listNode) { + public DefSpecialForm(ListNode listNode) { super(listNode); } diff --git a/src/main/java/serene/simple/Main.java b/src/main/java/serene/simple/Main.java index 9686737..5725208 100644 --- a/src/main/java/serene/simple/Main.java +++ b/src/main/java/serene/simple/Main.java @@ -25,24 +25,29 @@ public class Main { System.out.println("Serene 'simple' v0.1.0"); while(true) { - //String inputData = console.readLine("serene-> "); - String inputData = "(def a 4)"; + String inputData = console.readLine("serene-> "); if (inputData == null) break; ByteArrayInputStream inputStream = new ByteArrayInputStream(inputData.getBytes()); ListNode nodes = Reader.read(inputStream); - Object result = ListNode.EMPTY; + try { + Object result = ListNode.EMPTY; + for (Node n : nodes) { + result = n.eval(rootScope); + } - for (Node n : nodes) { - result = n.eval(rootScope); + if (result != ListNode.EMPTY) { + System.out.print(";; "); + System.out.println(result); + } + } + catch(Exception e) { + System.out.println("Error: "); + e.printStackTrace(System.out); } - System.out.print(";; "); - if (result != ListNode.EMPTY) { - System.out.println(result); - } } } diff --git a/src/main/java/serene/simple/Node.java b/src/main/java/serene/simple/Node.java index 3a36ec5..93d4e22 100644 --- a/src/main/java/serene/simple/Node.java +++ b/src/main/java/serene/simple/Node.java @@ -9,4 +9,8 @@ public abstract class Node { return this == n; } + public String toString() { + String className = this.getClass().getName(); + return String.format("%s<%s>", className, System.identityHashCode(this)); + } } diff --git a/src/main/java/serene/simple/Reader.java b/src/main/java/serene/simple/Reader.java index deb3393..f2b9908 100644 --- a/src/main/java/serene/simple/Reader.java +++ b/src/main/java/serene/simple/Reader.java @@ -34,7 +34,6 @@ public class Reader { public static ListNode read(PushbackReader inputStream) throws IOException { List nodes = new ArrayList(); - skipWhiteSpaces(inputStream); char c = (char) inputStream.read(); @@ -72,19 +71,19 @@ public class Reader { } private static Node readSymbol(PushbackReader inputStream) throws IOException { + String str = ""; - String str = ""; + while (true) { + int ch = inputStream.read(); - while (true) { - int ch = inputStream.read(); - if(isWhiteSpace(ch)) { - inputStream.unread(ch); - break; - }; - str = str + (char) ch; - } + if(isWhiteSpace(ch) || ch == -1) { + inputStream.unread(ch); + break; + }; + str = str + (char) ch; + } - return new SymbolNode(str); + return new SymbolNode(str); } private static Node readNumber(PushbackReader inputStream) throws IOException { @@ -109,6 +108,8 @@ public class Reader { } private static boolean isWhiteSpace(int ch) { - return (ch == ' ' || ch == '\t' || ch == '\f' || ch == '\r' || ch == '\n'); + return (ch == ' ' || ch == '\t' || + ch == '\f' || ch == '\r' || + ch == '\n'); } } diff --git a/src/main/java/serene/simple/SpecialForm.java b/src/main/java/serene/simple/SpecialForm.java index 2611e98..ad67c8c 100644 --- a/src/main/java/serene/simple/SpecialForm.java +++ b/src/main/java/serene/simple/SpecialForm.java @@ -14,12 +14,6 @@ public class SpecialForm extends Node { } public static Node check(ListNode l) { - if (l != ListNode.EMPTY && l.first() instanceof SymbolNode) { - System.out.println(">>>>"); - //SymbolNode g = l.first(); - //System.out.println(g.); - } - if (l == ListNode.EMPTY) { return l; } else if (l.first().equals(DEF)) { diff --git a/src/main/java/serene/simple/SymbolNode.java b/src/main/java/serene/simple/SymbolNode.java index ddd5582..de27935 100644 --- a/src/main/java/serene/simple/SymbolNode.java +++ b/src/main/java/serene/simple/SymbolNode.java @@ -1,25 +1,32 @@ package serene.simple; public class SymbolNode extends Node { - public final String name; + public String name; public SymbolNode(String name) { this.name = name; } + @Override + public boolean equals(Node other) { + if (other instanceof SymbolNode) { + SymbolNode n = (SymbolNode) other; - public boolean equals(SymbolNode n) { - System.out.println("><<><>"); - System.out.println(n.name); - if (this.name == n.name) { - return true; + if (this.name.equals(n.name)) { + return true; + } + + return false; } - - return false; + return super.equals(other); } @Override public Object eval(Scope scope) { return scope.lookupSymbol(this.name); } + + public String toString() { + return String.format("Symbol<%s>", this.name); + } }