From e3b6a054b4eec60077f0c0b94ddc88d9f506cab9 Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Wed, 18 Dec 2019 17:45:43 +0000 Subject: [PATCH] All the initial special forms has been done --- src/main/java/serene/simple/FalseNode.java | 5 +++++ src/main/java/serene/simple/FnSpecialForm.java | 5 +++++ src/main/java/serene/simple/FunctionNode.java | 5 +++++ src/main/java/serene/simple/ListNode.java | 13 +++++++++++++ src/main/java/serene/simple/Main.java | 5 +++-- src/main/java/serene/simple/NilNode.java | 6 ++++++ src/main/java/serene/simple/Node.java | 1 + src/main/java/serene/simple/NumberNode.java | 7 ++++++- src/main/java/serene/simple/QuoteSpecialForm.java | 14 +++++++++++--- src/main/java/serene/simple/Reader.java | 8 ++++---- src/main/java/serene/simple/SpecialForm.java | 8 +++++--- src/main/java/serene/simple/SymbolNode.java | 3 ++- src/main/java/serene/simple/TrueNode.java | 5 +++++ 13 files changed, 71 insertions(+), 14 deletions(-) diff --git a/src/main/java/serene/simple/FalseNode.java b/src/main/java/serene/simple/FalseNode.java index 18d8ee2..28c11e0 100644 --- a/src/main/java/serene/simple/FalseNode.java +++ b/src/main/java/serene/simple/FalseNode.java @@ -7,4 +7,9 @@ public class FalseNode extends Node { public Object eval(Scope scope) { return false; } + + @Override + public String toString() { + return "false"; + } } diff --git a/src/main/java/serene/simple/FnSpecialForm.java b/src/main/java/serene/simple/FnSpecialForm.java index 8a63e29..a569952 100644 --- a/src/main/java/serene/simple/FnSpecialForm.java +++ b/src/main/java/serene/simple/FnSpecialForm.java @@ -39,6 +39,11 @@ public class FnSpecialForm extends SpecialForm { return output; } + + @Override + public String toString() { + return "Function@" + System.identityHashCode(this); + } }; } } diff --git a/src/main/java/serene/simple/FunctionNode.java b/src/main/java/serene/simple/FunctionNode.java index 0f80ff0..0f35c51 100644 --- a/src/main/java/serene/simple/FunctionNode.java +++ b/src/main/java/serene/simple/FunctionNode.java @@ -5,4 +5,9 @@ public class FunctionNode extends Node { public Object eval(Scope scope) { return this; } + + @Override + public String toString() { + return "Function@" + this; + } } diff --git a/src/main/java/serene/simple/ListNode.java b/src/main/java/serene/simple/ListNode.java index dc680cc..4475574 100644 --- a/src/main/java/serene/simple/ListNode.java +++ b/src/main/java/serene/simple/ListNode.java @@ -94,4 +94,17 @@ public class ListNode extends Node implements Iterable { } }; } + + public String toString() { + if (this.length == 0) { + return "()"; + } + + String output = "(" + this.first(); + for(Node x : this.rest()) { + output = output + " " + x.toString(); + } + + return output + ")"; + } } diff --git a/src/main/java/serene/simple/Main.java b/src/main/java/serene/simple/Main.java index 6b62aff..22e4391 100644 --- a/src/main/java/serene/simple/Main.java +++ b/src/main/java/serene/simple/Main.java @@ -31,9 +31,10 @@ public class Main { if (inputData == null) break; ByteArrayInputStream inputStream = new ByteArrayInputStream(inputData.getBytes()); - ListNode nodes = Reader.read(inputStream); + try { + ListNode nodes = Reader.read(inputStream); Object result = ListNode.EMPTY; for (Node n : nodes) { @@ -42,7 +43,7 @@ public class Main { if (result != ListNode.EMPTY) { System.out.print(";; "); - System.out.println(result); + System.out.println(result.toString()); } } catch(Exception e) { diff --git a/src/main/java/serene/simple/NilNode.java b/src/main/java/serene/simple/NilNode.java index e0a5380..da9d4eb 100644 --- a/src/main/java/serene/simple/NilNode.java +++ b/src/main/java/serene/simple/NilNode.java @@ -7,4 +7,10 @@ public class NilNode extends Node { public Object eval(Scope scope) { return this; } + + @Override + public String toString() { + return "nil"; + } + } diff --git a/src/main/java/serene/simple/Node.java b/src/main/java/serene/simple/Node.java index 93d4e22..b04bbb3 100644 --- a/src/main/java/serene/simple/Node.java +++ b/src/main/java/serene/simple/Node.java @@ -9,6 +9,7 @@ public abstract class Node { return this == n; } + @Override 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/NumberNode.java b/src/main/java/serene/simple/NumberNode.java index 8d85e8b..8cab51c 100644 --- a/src/main/java/serene/simple/NumberNode.java +++ b/src/main/java/serene/simple/NumberNode.java @@ -11,4 +11,9 @@ public class NumberNode extends Node { public Object eval(Scope scope) { return this.value; } -} + + @Override + public String toString() { + return String.format("%s", this.value); + } + } diff --git a/src/main/java/serene/simple/QuoteSpecialForm.java b/src/main/java/serene/simple/QuoteSpecialForm.java index 4a33c83..ed8a9b9 100644 --- a/src/main/java/serene/simple/QuoteSpecialForm.java +++ b/src/main/java/serene/simple/QuoteSpecialForm.java @@ -1,13 +1,21 @@ package serene.simple; - public class QuoteSpecialForm extends SpecialForm { - public QuoteSpecialForm(ListNode node) { + + // public QuoteSpecialForm(Node node) { + // this.x = node; + // } + + public QuoteSpecialForm(ListNode node) throws SereneException { super(node); + + if (this.node.rest().length != 1) { + throw new SereneException("quote expects only one arguement"); + } } @Override public Object eval(final Scope scope) { - return this.node; + return this.node.rest().first(); } } diff --git a/src/main/java/serene/simple/Reader.java b/src/main/java/serene/simple/Reader.java index b4147ef..82a7c29 100644 --- a/src/main/java/serene/simple/Reader.java +++ b/src/main/java/serene/simple/Reader.java @@ -10,7 +10,7 @@ import java.util.List; public class Reader { - public static Node readNode(PushbackReader inputStream) throws IOException { + public static Node readNode(PushbackReader inputStream) throws IOException, IllegalArgumentException, SereneException { char c = (char) inputStream.read(); inputStream.unread(c); @@ -28,11 +28,11 @@ public class Reader { } } - public static ListNode read(InputStream inputStream) throws IOException { + public static ListNode read(InputStream inputStream) throws IOException, IllegalArgumentException, SereneException { return read(new PushbackReader(new InputStreamReader(inputStream))); } - public static ListNode read(PushbackReader inputStream) throws IOException { + public static ListNode read(PushbackReader inputStream) throws IOException, IllegalArgumentException, SereneException { List nodes = new ArrayList(); skipWhiteSpaces(inputStream); @@ -47,7 +47,7 @@ public class Reader { return ListNode.list(nodes); } - private static Node readList(PushbackReader inputStream) throws IOException { + private static Node readList(PushbackReader inputStream) throws IOException, SereneException { char opening = (char) inputStream.read(); assert opening == '(' : "Lists must start with a '('"; diff --git a/src/main/java/serene/simple/SpecialForm.java b/src/main/java/serene/simple/SpecialForm.java index ad67c8c..9764d51 100644 --- a/src/main/java/serene/simple/SpecialForm.java +++ b/src/main/java/serene/simple/SpecialForm.java @@ -7,13 +7,15 @@ public class SpecialForm extends Node { private static final SymbolNode IF = new SymbolNode("if"); private static final SymbolNode QUOTE = new SymbolNode("quote"); - public final ListNode node; + public ListNode node; + + public SpecialForm() {} public SpecialForm(ListNode node) { this.node = node; } - public static Node check(ListNode l) { + public static Node check(ListNode l) throws SereneException { if (l == ListNode.EMPTY) { return l; } else if (l.first().equals(DEF)) { @@ -30,7 +32,7 @@ public class SpecialForm extends Node { } @Override - public Object eval(Scope scope) { + public Object eval(Scope scope) throws SereneException { throw new SereneException("Can't use SpecialForm directly"); } } diff --git a/src/main/java/serene/simple/SymbolNode.java b/src/main/java/serene/simple/SymbolNode.java index de27935..53382a8 100644 --- a/src/main/java/serene/simple/SymbolNode.java +++ b/src/main/java/serene/simple/SymbolNode.java @@ -26,7 +26,8 @@ public class SymbolNode extends Node { return scope.lookupSymbol(this.name); } + @Override public String toString() { - return String.format("Symbol<%s>", this.name); + return this.name; } } diff --git a/src/main/java/serene/simple/TrueNode.java b/src/main/java/serene/simple/TrueNode.java index 0d671af..6906003 100644 --- a/src/main/java/serene/simple/TrueNode.java +++ b/src/main/java/serene/simple/TrueNode.java @@ -5,4 +5,9 @@ public class TrueNode extends Node { public Object eval(Scope scope) { return true; } + + @Override + public String toString() { + return "true"; + } }