From 516a606aabed940f993d91842fa1ce0d9cf6c43a Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Tue, 31 Dec 2019 18:00:30 +0000 Subject: [PATCH] eq fn has been added --- src/main/java/serene/simple/RootScope.java | 12 +--- src/main/java/serene/simple/SNumber.java | 3 + src/main/java/serene/simple/TrueNode.java | 2 +- src/main/java/serene/simple/builtin/EqFn.java | 59 +++++++++++++++++++ 4 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 src/main/java/serene/simple/builtin/EqFn.java diff --git a/src/main/java/serene/simple/RootScope.java b/src/main/java/serene/simple/RootScope.java index ca63fad..ca65c33 100644 --- a/src/main/java/serene/simple/RootScope.java +++ b/src/main/java/serene/simple/RootScope.java @@ -22,14 +22,8 @@ package serene.simple; import java.util.HashMap; import java.util.Map; -import serene.simple.builtin.PrintlnFn; -import serene.simple.builtin.QuitFn; -import serene.simple.builtin.PlusFn; -import serene.simple.builtin.MinusFn; -import serene.simple.builtin.TimesFn; -import serene.simple.builtin.ObelusFn; -import serene.simple.builtin.ModFn; -import serene.simple.builtin.NewFn; +import serene.simple.builtin.*; + public class RootScope extends AScope { @@ -41,6 +35,7 @@ public class RootScope extends AScope { put("*", new TimesFn()); put("/", new ObelusFn()); put("mod", new ModFn()); + put("=", new EqFn()); put("System", System.class); put("Boolean", Boolean.class); put("String", String.class); @@ -48,7 +43,6 @@ public class RootScope extends AScope { }}; - // "mod", ModFn, // "now", NowFn,; public RootScope() { diff --git a/src/main/java/serene/simple/SNumber.java b/src/main/java/serene/simple/SNumber.java index 958fcd4..c74aa7f 100644 --- a/src/main/java/serene/simple/SNumber.java +++ b/src/main/java/serene/simple/SNumber.java @@ -150,6 +150,9 @@ public class SNumber { } } + /** + * Double number implementation. + */ public static class DoubleNumber implements IOps { private Double v; diff --git a/src/main/java/serene/simple/TrueNode.java b/src/main/java/serene/simple/TrueNode.java index 43c5ff3..bb1e0ba 100644 --- a/src/main/java/serene/simple/TrueNode.java +++ b/src/main/java/serene/simple/TrueNode.java @@ -22,7 +22,7 @@ package serene.simple; public class TrueNode extends Node { @Override public Object eval(IScope scope) { - return true; + return Boolean.TRUE; } @Override diff --git a/src/main/java/serene/simple/builtin/EqFn.java b/src/main/java/serene/simple/builtin/EqFn.java new file mode 100644 index 0000000..59435f4 --- /dev/null +++ b/src/main/java/serene/simple/builtin/EqFn.java @@ -0,0 +1,59 @@ +/** + * Serene (simple) - A PoC lisp to collect data on Serenes concepts + * Copyright (C) 2019-2020 Sameer Rahmani + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ +package serene.simple.builtin; + +import java.util.List; + +import serene.simple.IScope; +import serene.simple.SNumber; +import serene.simple.SereneException; + + +public class EqFn extends AFn { + public String fnName() { + return "="; + }; + + public Object eval(IScope scope) throws SereneException{ + List args = this.arguments(); + + if (args.size() == 0) { + throw new SereneException( + "ArityError: You need 1 or more parameters for this functions."); + } + + if (args.size() == 1) { + return true; + } + + Object result = args.get(0); + + for (Object x : args.subList(1, args.size())) { + if (x == null) { + result = (Object) (result == null); + } + else { + result = result.equals(x); + } + } + + return (boolean) result; + } +}