diff --git a/src/main/java/serene/simple/FalseNode.java b/src/main/java/serene/simple/FalseNode.java index 28c11e0..e218dee 100644 --- a/src/main/java/serene/simple/FalseNode.java +++ b/src/main/java/serene/simple/FalseNode.java @@ -5,7 +5,7 @@ public class FalseNode extends Node { @Override public Object eval(Scope scope) { - return false; + return Boolean.FALSE; } @Override diff --git a/src/main/java/serene/simple/IfSpecialForm.java b/src/main/java/serene/simple/IfSpecialForm.java index d007ea0..21c44b0 100644 --- a/src/main/java/serene/simple/IfSpecialForm.java +++ b/src/main/java/serene/simple/IfSpecialForm.java @@ -17,7 +17,7 @@ public class IfSpecialForm extends SpecialForm { @Override public Object eval(final Scope scope) { Object result = this.pred.eval(scope); - if (result == null) { + if (result == null || (result instanceof Boolean && (Boolean) result == false)) { return this.elseNode.eval(scope); } return this.ifNode.eval(scope); diff --git a/src/main/java/serene/simple/Main.java b/src/main/java/serene/simple/Main.java index 22e4391..72295f8 100644 --- a/src/main/java/serene/simple/Main.java +++ b/src/main/java/serene/simple/Main.java @@ -43,7 +43,12 @@ public class Main { if (result != ListNode.EMPTY) { System.out.print(";; "); - System.out.println(result.toString()); + if (result == null) { + System.out.println("nil"); + } + else { + 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 da9d4eb..3a78374 100644 --- a/src/main/java/serene/simple/NilNode.java +++ b/src/main/java/serene/simple/NilNode.java @@ -5,7 +5,7 @@ public class NilNode extends Node { @Override public Object eval(Scope scope) { - return this; + return null; } @Override diff --git a/src/main/java/serene/simple/Reader.java b/src/main/java/serene/simple/Reader.java index 82a7c29..59bc0eb 100644 --- a/src/main/java/serene/simple/Reader.java +++ b/src/main/java/serene/simple/Reader.java @@ -83,7 +83,17 @@ public class Reader { str = str + (char) ch; } - return new SymbolNode(str); + switch(str) { + case "true": + return new TrueNode(); + case "false": + return new FalseNode(); + case "nil": + return new NilNode(); + default: + return new SymbolNode(str); + } + } private static Node readNumber(PushbackReader inputStream) throws IOException {