|
@@ -0,0 +1,58 @@
|
|
|
+package migl.lisp.operator;
|
|
|
+
|
|
|
+import java.math.BigInteger;
|
|
|
+
|
|
|
+import migl.lisp.LispElement;
|
|
|
+import migl.lisp.LispError;
|
|
|
+import migl.lisp.LispOperator;
|
|
|
+import migl.util.ConsList;
|
|
|
+
|
|
|
+public class MinMaxOperator implements LispOperator {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public LispElement apply(String operator, ConsList<Object> lisp) throws LispError {
|
|
|
+ if(lisp.size() == 0) {
|
|
|
+ throw new LispError(LispError.ERR_NUM_ARG);
|
|
|
+ }
|
|
|
+ //Initialise avec la 1er valeur
|
|
|
+ LispElement elt = LispElement.getElement(lisp.car());
|
|
|
+ lisp = lisp.cdr();
|
|
|
+ BigInteger res = elt.toInt();
|
|
|
+ //Parcours les elements suivants
|
|
|
+ while(!lisp.isEmpty()) {
|
|
|
+ elt = LispElement.getElement(lisp.car());
|
|
|
+ if(elt.value.getClass() != BigInteger.class) break;
|
|
|
+ switch(operator) {
|
|
|
+ case "max":
|
|
|
+ res = res.max(elt.toInt());
|
|
|
+ break;
|
|
|
+ case "min":
|
|
|
+ res = res.min(elt.toInt());
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new LispError(operator + LispError.ERR_UNKNOW);
|
|
|
+ }
|
|
|
+ lisp = lisp.cdr();
|
|
|
+ }
|
|
|
+ //Si on finit la liste avec que des entier on retourne
|
|
|
+ if(lisp.isEmpty()) return LispElement.generate(res);
|
|
|
+ //Sinon on continue en passant en double
|
|
|
+ double result = res.doubleValue();
|
|
|
+ while(!lisp.isEmpty()) {
|
|
|
+ double value = LispElement.getElement(lisp.car()).toNumber();
|
|
|
+ switch(operator) {
|
|
|
+ case "max":
|
|
|
+ result = (value > result) ? value : result;
|
|
|
+ break;
|
|
|
+ case "min":
|
|
|
+ result = (value < result) ? value : result;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new LispError(operator + LispError.ERR_UNKNOW);
|
|
|
+ }
|
|
|
+ lisp = lisp.cdr();
|
|
|
+ }
|
|
|
+ return LispElement.generate(result);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|