Forráskód Böngészése

:recycle: Refactoring operateur de comparaison

Arthur Brandao 6 éve
szülő
commit
f73a266957

+ 6 - 98
src/migl/lisp/LispImpl.java

@@ -8,6 +8,7 @@ import java.util.Queue;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import migl.lisp.operator.ComparatorOperator;
 import migl.lisp.operator.ConsOperator;
 import migl.util.ConsList;
 import migl.util.ConsListFactory;
@@ -23,6 +24,11 @@ public class LispImpl implements Lisp {
 	static {
 		//Définition des opérateurs
 		operators.put("cons", new ConsOperator());
+		operators.put(">", new ComparatorOperator());
+		operators.put(">=", new ComparatorOperator());
+		operators.put("<", new ComparatorOperator());
+		operators.put("<=", new ComparatorOperator());
+		operators.put("=", new ComparatorOperator());
 		operators.put("quote", (op, lisp) -> {
 			if(lisp.size() != 1) {
 				throw new LispError(LispError.ERR_NUM_ARG);
@@ -62,104 +68,6 @@ public class LispImpl implements Lisp {
 			}
 			return LispElement.generate(result);
 		});
-		operators.put(">", (op, lisp) -> {
-			if(lisp.size() == 0) {
-				throw new LispError(LispError.ERR_NUM_ARG);
-			}
-			boolean result = true;
-			boolean first = true;
-			double value = 0;
-			while(!lisp.isEmpty()) {
-				if(first) {
-					value = LispElement.getElement(lisp.car()).toNumber();
-					first = false;
-				} else {
-					double temp = LispElement.getElement(lisp.car()).toNumber();
-					result = result && (value > temp);
-					value = temp;
-				}
-				lisp = lisp.cdr();
-			}
-			return LispElement.generate(result);
-		});
-		operators.put(">=", (op, lisp) -> {
-			if(lisp.size() == 0) {
-				throw new LispError(LispError.ERR_NUM_ARG);
-			}
-			boolean result = true;
-			boolean first = true;
-			double value = 0;
-			while(!lisp.isEmpty()) {
-				if(first) {
-					value = LispElement.getElement(lisp.car()).toNumber();
-					first = false;
-				} else {
-					double temp = LispElement.getElement(lisp.car()).toNumber();
-					result = result && (value >= temp);
-					value = temp;
-				}
-				lisp = lisp.cdr();
-			}
-			return LispElement.generate(result);
-		});
-		operators.put("<", (op, lisp) -> {
-			if(lisp.size() == 0) {
-				throw new LispError(LispError.ERR_NUM_ARG);
-			}
-			boolean result = true;
-			boolean first = true;
-			double value = 0;
-			while(!lisp.isEmpty()) {
-				if(first) {
-					value = LispElement.getElement(lisp.car()).toNumber();
-					first = false;
-				} else {
-					double temp = LispElement.getElement(lisp.car()).toNumber();
-					result = result && (value < temp);
-					value = temp;
-				}
-				lisp = lisp.cdr();
-			}
-			return LispElement.generate(result);
-		});
-		operators.put("<=", (op, lisp) -> {
-			if(lisp.size() == 0) {
-				throw new LispError(LispError.ERR_NUM_ARG);
-			}
-			boolean result = true;
-			boolean first = true;
-			double value = 0;
-			while(!lisp.isEmpty()) {
-				if(first) {
-					value = LispElement.getElement(lisp.car()).toNumber();
-					first = false;
-				} else {
-					double temp = LispElement.getElement(lisp.car()).toNumber();
-					result = result && (value <= temp);
-					value = temp;
-				}
-				lisp = lisp.cdr();
-			}
-			return LispElement.generate(result);
-		});
-		operators.put("=", (op, lisp) -> {
-			if(lisp.size() == 0) {
-				throw new LispError(LispError.ERR_NUM_ARG);
-			}
-			boolean result = true;
-			boolean first = true;
-			double value = 0;
-			while(!lisp.isEmpty()) {
-				if(first) {
-					value = LispElement.getElement(lisp.car()).toNumber();
-					first = false;
-				} else {
-					result = result && (value == LispElement.getElement(lisp.car()).toNumber());
-				}	
-				lisp = lisp.cdr();
-			}
-			return LispElement.generate(result);
-		});
 		operators.put("+", (op, lisp) -> {
 			BigInteger resultInt = new BigInteger("0");
             while(!lisp.isEmpty()){

+ 50 - 0
src/migl/lisp/operator/ComparatorOperator.java

@@ -0,0 +1,50 @@
+package migl.lisp.operator;
+
+import migl.lisp.LispElement;
+import migl.lisp.LispError;
+import migl.lisp.LispOperator;
+import migl.util.ConsList;
+
+public class ComparatorOperator implements LispOperator {
+
+	@Override
+	public LispElement apply(String operator, ConsList<Object> lisp) throws LispError {
+		if(lisp.size() == 0) {
+			throw new LispError(LispError.ERR_NUM_ARG);
+		}
+		boolean result = true;
+		boolean first = true;
+		double value = 0;
+		while(!lisp.isEmpty()) {
+			if(first) {
+				value = LispElement.getElement(lisp.car()).toNumber();
+				first = false;
+			} else {
+				double temp = LispElement.getElement(lisp.car()).toNumber();
+				switch(operator) {
+					case ">":
+						result = result && (value > temp);
+						break;
+					case ">=":
+						result = result && (value >= temp);
+						break;
+					case "<":
+						result = result && (value < temp);
+						break;
+					case "<=":
+						result = result && (value <= temp);
+						break;
+					case "=":
+						result = result && (value == temp);
+						break;
+					default:
+						throw new LispError("Unknow operation");
+				}
+				value = temp;
+			}
+			lisp = lisp.cdr();
+		}
+		return LispElement.generate(result);
+	}
+
+}