Przeglądaj źródła

Ajout operateur abs

Arthur Brandao 6 lat temu
rodzic
commit
45a1e83fe2
1 zmienionych plików z 14 dodań i 6 usunięć
  1. 14 6
      src/migl/lisp/LispEval.java

+ 14 - 6
src/migl/lisp/LispEval.java

@@ -110,16 +110,14 @@ public class LispEval {
 			switch(lisp.size()) {				
 				case 1:
 					LispElement elt = LispElement.getElement(lisp.car());
-					if(elt.value.getClass() == Double.class) {
-						//return LispElement.generate(elt.toNumber() * -1); //Pb pitest qui remplace * par / or *-1 == /-1
-						double value = elt.toNumber();
-						return LispElement.generate(value - (value * 2));
+					if(elt.isNumber()) {
+						return LispElement.generate(elt.toNumber() * -1); //Pb pitest qui remplace * par / or *-1 == /-1
 					}
 					return LispElement.generate(elt.toInt().multiply(new BigInteger("-1")));
 				case 2:
 					LispElement elt1 = LispElement.getElement(lisp.car());
 					LispElement elt2 = LispElement.getElement(lisp.cdr().car());
-					if(elt1.value.getClass() == Double.class || elt2.value.getClass() == Double.class) {
+					if(elt1.isNumber() || elt2.isNumber()) {
 						return LispElement.generate(elt1.toNumber() - elt2.toNumber());
 					}
 					return LispElement.generate(elt1.toInt().subtract(elt2.toInt()));
@@ -136,11 +134,21 @@ public class LispEval {
 			if(elt2.toNumber() == 0) {
 				throw new LispError("Division by zero");
 			}
-			if(elt1.value.getClass() == Double.class || elt2.value.getClass() == Double.class) {
+			if(elt1.isNumber() || elt2.isNumber()) {
 				return LispElement.generate(elt1.toNumber() / elt2.toNumber());
 			}
 			return LispElement.generate(elt1.toInt().divide(elt2.toInt()));
 		});
+		operators.put("abs", (op, lisp) -> {
+			if(lisp.size() != 1) {
+				throw new LispError(LispError.ERR_NUM_ARG);
+			}
+			LispElement le = LispElement.getElement(lisp.car());
+			if(le.isInt()) {
+				return LispElement.generate(le.toInt().abs());
+			}
+			return LispElement.generate(Math.abs(le.toNumber()));
+		});
 	}
 
 	private Object lispElt = null;