From e5d8a44ca864e52b25cdeb52ea2ec71d211f8bf4 Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Fri, 3 Jan 2020 00:03:56 +0000 Subject: [PATCH] Native reduce function has been added --- benchmarks/fib.srns | 2 +- src/main/java/serene/simple/RootScope.java | 1 + .../java/serene/simple/builtin/ReduceFn.java | 65 +++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/main/java/serene/simple/builtin/ReduceFn.java diff --git a/benchmarks/fib.srns b/benchmarks/fib.srns index 90ea927..dded7cd 100644 --- a/benchmarks/fib.srns +++ b/benchmarks/fib.srns @@ -1,4 +1,4 @@ -(def reduce +(def reduce1 (fn (f xs initial-value) (cond ((first xs) (reduce f (rest xs) (f initial-value (first xs)))) diff --git a/src/main/java/serene/simple/RootScope.java b/src/main/java/serene/simple/RootScope.java index 2a203d9..a8198f7 100644 --- a/src/main/java/serene/simple/RootScope.java +++ b/src/main/java/serene/simple/RootScope.java @@ -51,6 +51,7 @@ public class RootScope extends AScope { put("first", new FirstFn()); put("rest", new RestFn()); put("doc", new DocFn()); + put("reduce", new ReduceFn()); put("System", System.class); put("Boolean", Boolean.class); put("String", String.class); diff --git a/src/main/java/serene/simple/builtin/ReduceFn.java b/src/main/java/serene/simple/builtin/ReduceFn.java new file mode 100644 index 0000000..f7039a6 --- /dev/null +++ b/src/main/java/serene/simple/builtin/ReduceFn.java @@ -0,0 +1,65 @@ +/** + * 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 java.util.function.Function; + +import serene.simple.IDoc; +import serene.simple.IScope; +import serene.simple.ListNode; +import serene.simple.SereneException; + + +public class ReduceFn extends AFn implements IDoc { + public String fnName() { + return "reduce"; + }; + + public String getDoc() { + return "(reduce f coll initial-value): Reduce the COLL by applying F."; + } + + public Object eval(IScope scope) throws SereneException{ + List args = this.arguments(); + + if (args.size() != 3) { + throw new SereneException( + String.format("reduce expects 3 parameters. Got %s", args.size())); + } + + Function fn = (Function) args.get(0); + ListNode coll = (ListNode) args.get(1); + Object initialValue = args.get(2); + + while(true) { + Object x = coll.first(); + + if (x == null) + break; + + Object[] fnArgs = { initialValue, x }; + coll = coll.rest(); + initialValue = fn.apply(fnArgs); + } + + return initialValue; + } +}