Преглед на файлове

Ajout floor + Refactoring operateur mathematique

Arthur Brandao преди 6 години
родител
ревизия
c991e4e7e4
променени са 2 файла, в които са добавени 32 реда и са изтрити 12 реда
  1. 4 12
      src/migl/lisp/LispEval.java
  2. 28 0
      src/migl/lisp/operator/MathOperator.java

+ 4 - 12
src/migl/lisp/LispEval.java

@@ -7,6 +7,7 @@ import java.util.Map;
 import migl.lisp.operator.ComparatorOperator;
 import migl.lisp.operator.ConsOperator;
 import migl.lisp.operator.DefineOperator;
+import migl.lisp.operator.MathOperator;
 import migl.lisp.operator.MinMaxOperator;
 import migl.util.ConsList;
 
@@ -29,6 +30,9 @@ public class LispEval {
 		operators.put("=", new ComparatorOperator());
 		operators.put("min", new MinMaxOperator());
 		operators.put("max", new MinMaxOperator());
+		operators.put("cbrt", new MathOperator());
+		operators.put("ceil", new MathOperator());
+		operators.put("floor", new MathOperator());
 		operators.put("quote", (op, lisp) -> {
 			if(lisp.size() != 1) {
 				throw new LispError(LispError.ERR_NUM_ARG);
@@ -149,18 +153,6 @@ public class LispEval {
 			}
 			return LispElement.generate(Math.abs(le.toNumber()));
 		});
-		operators.put("cbrt", (op, lisp) -> {
-			if(lisp.size() != 1) {
-				throw new LispError(LispError.ERR_NUM_ARG);
-			}
-			return LispElement.generate(Math.cbrt(LispElement.getElement(lisp.car()).toNumber()));
-		});
-		operators.put("ceil", (op, lisp) -> {
-			if(lisp.size() != 1) {
-				throw new LispError(LispError.ERR_NUM_ARG);
-			}
-			return LispElement.generate(Math.ceil(LispElement.getElement(lisp.car()).toNumber()));
-		});
 	}
 
 	private Object lispElt = null;

+ 28 - 0
src/migl/lisp/operator/MathOperator.java

@@ -0,0 +1,28 @@
+package migl.lisp.operator;
+
+import migl.lisp.LispElement;
+import migl.lisp.LispError;
+import migl.lisp.LispOperator;
+import migl.util.ConsList;
+
+public class MathOperator implements LispOperator {
+
+	@Override
+	public LispElement apply(String operator, ConsList<Object> lisp) throws LispError {
+		if(lisp.size() != 1) {
+			throw new LispError(LispError.ERR_NUM_ARG);
+		}
+		LispElement elt = LispElement.getElement(lisp.car());
+		switch(operator) {
+			case "cbrt":
+				return LispElement.generate(Math.cbrt(elt.toNumber()));
+			case "ceil":
+				return LispElement.generate(Math.ceil(elt.toNumber()));
+			case "floor":
+				return LispElement.generate(Math.floor(elt.toNumber()));
+			default:
+				throw new LispError(operator + LispError.ERR_UNKNOW);
+		}
+	}
+
+}