diff --git a/src/main/java/serene/simple/DefSpecialForm.java b/src/main/java/serene/simple/DefSpecialForm.java index d784f02..2fa02fd 100644 --- a/src/main/java/serene/simple/DefSpecialForm.java +++ b/src/main/java/serene/simple/DefSpecialForm.java @@ -29,6 +29,6 @@ public class DefSpecialForm extends SpecialForm { SymbolNode sym = (SymbolNode) this.node.rest().first(); scope.insertSymbol(sym.name, this.node.rest().rest().first().eval(scope)); - return ListNode.EMPTY; + return null; } } diff --git a/src/main/java/serene/simple/RootScope.java b/src/main/java/serene/simple/RootScope.java index ad3d20b..d58cfd7 100644 --- a/src/main/java/serene/simple/RootScope.java +++ b/src/main/java/serene/simple/RootScope.java @@ -46,7 +46,8 @@ public class RootScope extends AScope { put("conj", new ConjFn()); put("list", new ListFn()); put("first", new FirstFn()); - // put("let", new LetFn()); + put("rest", new RestFn()); + //put("let", new LetFn()); // put("cond", new CondFn()); //put("reduce", new ReduceFn()); put("System", System.class); diff --git a/src/main/java/serene/simple/builtin/FirstFn.java b/src/main/java/serene/simple/builtin/FirstFn.java new file mode 100644 index 0000000..000099e --- /dev/null +++ b/src/main/java/serene/simple/builtin/FirstFn.java @@ -0,0 +1,47 @@ +/** + * 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.ListNode; +import serene.simple.SereneException; + + +public class FirstFn extends AFn { + public String fnName() { + return "first"; + }; + + public Object eval(IScope scope) throws SereneException{ + List args = this.arguments(); + + if (args.size() == 0) { + throw new SereneException("First of what ?"); + } + + if (args.size() > 1) { + throw new SereneException("Too many parameters to 'first'."); + } + + return ((ListNode) args.get(0)).first(); + } +} diff --git a/src/main/java/serene/simple/builtin/RestFn.java b/src/main/java/serene/simple/builtin/RestFn.java new file mode 100644 index 0000000..8baa4eb --- /dev/null +++ b/src/main/java/serene/simple/builtin/RestFn.java @@ -0,0 +1,47 @@ +/** + * 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.ListNode; +import serene.simple.SereneException; + + +public class RestFn extends AFn { + public String fnName() { + return "rest"; + }; + + public Object eval(IScope scope) throws SereneException{ + List args = this.arguments(); + + if (args.size() == 0) { + throw new SereneException("Rest of what ?"); + } + + if (args.size() > 1) { + throw new SereneException("Too many parameters to 'rest'."); + } + + return ((ListNode) args.get(0)).rest(); + } +}