ComparatorOperator.java 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package migl.lisp.operator;
  2. import migl.lisp.LispElement;
  3. import migl.lisp.LispError;
  4. import migl.lisp.LispEval;
  5. import migl.util.ConsList;
  6. public class ComparatorOperator implements LispOperator {
  7. @Override
  8. public LispElement apply(LispEval eval, String operator, ConsList<Object> lisp) throws LispError {
  9. if(lisp.size() == 0) {
  10. throw new LispError(LispError.ERR_NUM_ARG);
  11. }
  12. boolean result = true;
  13. boolean first = true;
  14. double value = 0;
  15. while(!lisp.isEmpty()) {
  16. if(first) {
  17. value = eval.getElement(lisp.car()).toNumber();
  18. first = false;
  19. } else {
  20. double temp = eval.getElement(lisp.car()).toNumber();
  21. switch(operator) {
  22. case ">":
  23. result = result && (value > temp);
  24. break;
  25. case ">=":
  26. result = result && (value >= temp);
  27. break;
  28. case "<":
  29. result = result && (value < temp);
  30. break;
  31. case "<=":
  32. result = result && (value <= temp);
  33. break;
  34. case "=":
  35. result = result && (value == temp);
  36. break;
  37. default:
  38. throw new LispError(operator + LispError.ERR_UNKNOW);
  39. }
  40. value = temp;
  41. }
  42. lisp = lisp.cdr();
  43. }
  44. return LispElement.generate(result);
  45. }
  46. }