|
@@ -21,56 +21,56 @@ public class LispEval {
|
|
if(lisp.size() != 1) {
|
|
if(lisp.size() != 1) {
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
- boolean result = !getElement(lisp.car()).getBool();
|
|
|
|
|
|
+ boolean result = !getElement(lisp.car()).toBoolean();
|
|
return LispElement.generate(result);
|
|
return LispElement.generate(result);
|
|
});
|
|
});
|
|
operators.put("and", (lisp) -> {
|
|
operators.put("and", (lisp) -> {
|
|
if(lisp.size() != 2) {
|
|
if(lisp.size() != 2) {
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
- boolean result = getElement(lisp.car()).getBool() && getElement(lisp.cdr().car()).getBool();
|
|
|
|
|
|
+ boolean result = getElement(lisp.car()).toBoolean() && getElement(lisp.cdr().car()).toBoolean();
|
|
return LispElement.generate(result);
|
|
return LispElement.generate(result);
|
|
});
|
|
});
|
|
operators.put("or", (lisp) -> {
|
|
operators.put("or", (lisp) -> {
|
|
if(lisp.size() != 2) {
|
|
if(lisp.size() != 2) {
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
- boolean result = getElement(lisp.car()).getBool() || getElement(lisp.cdr().car()).getBool();
|
|
|
|
|
|
+ boolean result = getElement(lisp.car()).toBoolean() || getElement(lisp.cdr().car()).toBoolean();
|
|
return LispElement.generate(result);
|
|
return LispElement.generate(result);
|
|
});
|
|
});
|
|
operators.put(">", (lisp) -> {
|
|
operators.put(">", (lisp) -> {
|
|
if(lisp.size() != 2) {
|
|
if(lisp.size() != 2) {
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
- boolean result = getElement(lisp.car()).getNumber() > getElement(lisp.cdr().car()).getNumber();
|
|
|
|
|
|
+ boolean result = getElement(lisp.car()).toNumber() > getElement(lisp.cdr().car()).toNumber();
|
|
return LispElement.generate(result);
|
|
return LispElement.generate(result);
|
|
});
|
|
});
|
|
operators.put(">=", (lisp) -> {
|
|
operators.put(">=", (lisp) -> {
|
|
if(lisp.size() != 2) {
|
|
if(lisp.size() != 2) {
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
- boolean result = getElement(lisp.car()).getNumber() >= getElement(lisp.cdr().car()).getNumber();
|
|
|
|
|
|
+ boolean result = getElement(lisp.car()).toNumber() >= getElement(lisp.cdr().car()).toNumber();
|
|
return LispElement.generate(result);
|
|
return LispElement.generate(result);
|
|
});
|
|
});
|
|
operators.put("<", (lisp) -> {
|
|
operators.put("<", (lisp) -> {
|
|
if(lisp.size() != 2) {
|
|
if(lisp.size() != 2) {
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
- boolean result = getElement(lisp.car()).getNumber() < getElement(lisp.cdr().car()).getNumber();
|
|
|
|
|
|
+ boolean result = getElement(lisp.car()).toNumber() < getElement(lisp.cdr().car()).toNumber();
|
|
return LispElement.generate(result);
|
|
return LispElement.generate(result);
|
|
});
|
|
});
|
|
operators.put("<=", (lisp) -> {
|
|
operators.put("<=", (lisp) -> {
|
|
if(lisp.size() != 2) {
|
|
if(lisp.size() != 2) {
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
- boolean result = getElement(lisp.car()).getNumber() <= getElement(lisp.cdr().car()).getNumber();
|
|
|
|
|
|
+ boolean result = getElement(lisp.car()).toNumber() <= getElement(lisp.cdr().car()).toNumber();
|
|
return LispElement.generate(result);
|
|
return LispElement.generate(result);
|
|
});
|
|
});
|
|
operators.put("=", (lisp) -> {
|
|
operators.put("=", (lisp) -> {
|
|
if(lisp.size() != 2) {
|
|
if(lisp.size() != 2) {
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
- boolean result = getElement(lisp.car()).getNumber() == getElement(lisp.cdr().car()).getNumber();
|
|
|
|
|
|
+ boolean result = getElement(lisp.car()).toNumber() == getElement(lisp.cdr().car()).toNumber();
|
|
return LispElement.generate(result);
|
|
return LispElement.generate(result);
|
|
});
|
|
});
|
|
operators.put("+", (lisp) -> {
|
|
operators.put("+", (lisp) -> {
|
|
@@ -78,7 +78,7 @@ public class LispEval {
|
|
double result = 0;
|
|
double result = 0;
|
|
while(!lisp.isEmpty()) {
|
|
while(!lisp.isEmpty()) {
|
|
LispElement<?> elt = getElement(lisp.car());
|
|
LispElement<?> elt = getElement(lisp.car());
|
|
- result += elt.getNumber();
|
|
|
|
|
|
+ result += elt.toNumber();
|
|
isInt = isInt && elt.value.getClass() == BigInteger.class;
|
|
isInt = isInt && elt.value.getClass() == BigInteger.class;
|
|
lisp = lisp.cdr();
|
|
lisp = lisp.cdr();
|
|
}
|
|
}
|
|
@@ -92,7 +92,7 @@ public class LispEval {
|
|
double result = 1;
|
|
double result = 1;
|
|
while(!lisp.isEmpty()) {
|
|
while(!lisp.isEmpty()) {
|
|
LispElement<?> elt = getElement(lisp.car());
|
|
LispElement<?> elt = getElement(lisp.car());
|
|
- result *= elt.getNumber();
|
|
|
|
|
|
+ result *= elt.toNumber();
|
|
isInt = isInt && elt.value.getClass() == BigInteger.class;
|
|
isInt = isInt && elt.value.getClass() == BigInteger.class;
|
|
lisp = lisp.cdr();
|
|
lisp = lisp.cdr();
|
|
}
|
|
}
|
|
@@ -106,16 +106,16 @@ public class LispEval {
|
|
case 1:
|
|
case 1:
|
|
LispElement<?> elt = getElement(lisp.car());
|
|
LispElement<?> elt = getElement(lisp.car());
|
|
if(elt.value.getClass() == Double.class) {
|
|
if(elt.value.getClass() == Double.class) {
|
|
- return LispElement.generate(elt.getNumber() * -1);
|
|
|
|
|
|
+ return LispElement.generate(elt.toNumber() * -1);
|
|
}
|
|
}
|
|
- return LispElement.generate(elt.getInt().multiply(new BigInteger("-1")));
|
|
|
|
|
|
+ return LispElement.generate(elt.toInt().multiply(new BigInteger("-1")));
|
|
case 2:
|
|
case 2:
|
|
LispElement<?> elt1 = getElement(lisp.car());
|
|
LispElement<?> elt1 = getElement(lisp.car());
|
|
LispElement<?> elt2 = getElement(lisp.cdr().car());
|
|
LispElement<?> elt2 = getElement(lisp.cdr().car());
|
|
if(elt1.value.getClass() == Double.class || elt2.value.getClass() == Double.class) {
|
|
if(elt1.value.getClass() == Double.class || elt2.value.getClass() == Double.class) {
|
|
- return LispElement.generate(elt1.getNumber() - elt2.getNumber());
|
|
|
|
|
|
+ return LispElement.generate(elt1.toNumber() - elt2.toNumber());
|
|
}
|
|
}
|
|
- return LispElement.generate(elt1.getInt().subtract(elt2.getInt()));
|
|
|
|
|
|
+ return LispElement.generate(elt1.toInt().subtract(elt2.toInt()));
|
|
default:
|
|
default:
|
|
throw new LispError("Incorrect number of argument");
|
|
throw new LispError("Incorrect number of argument");
|
|
}
|
|
}
|
|
@@ -127,9 +127,9 @@ public class LispEval {
|
|
LispElement<?> elt1 = getElement(lisp.car());
|
|
LispElement<?> elt1 = getElement(lisp.car());
|
|
LispElement<?> elt2 = getElement(lisp.cdr().car());
|
|
LispElement<?> elt2 = getElement(lisp.cdr().car());
|
|
if(elt1.value.getClass() == Double.class || elt2.value.getClass() == Double.class) {
|
|
if(elt1.value.getClass() == Double.class || elt2.value.getClass() == Double.class) {
|
|
- return LispElement.generate(elt1.getNumber() / elt2.getNumber());
|
|
|
|
|
|
+ return LispElement.generate(elt1.toNumber() / elt2.toNumber());
|
|
}
|
|
}
|
|
- return LispElement.generate(elt1.getInt().divide(elt2.getInt()));
|
|
|
|
|
|
+ return LispElement.generate(elt1.toInt().divide(elt2.toInt()));
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
@@ -141,7 +141,7 @@ public class LispEval {
|
|
}
|
|
}
|
|
|
|
|
|
public static LispElement<?> evaluate(ConsList<Object> lisp) throws LispError {
|
|
public static LispElement<?> evaluate(ConsList<Object> lisp) throws LispError {
|
|
- LispOperator op = operators.get(lisp.car().toString());
|
|
|
|
|
|
+ LispOperator op = operators.get(LispElement.generate(lisp.car()).toStr());
|
|
if(op == null) {
|
|
if(op == null) {
|
|
throw new LispError(new UnsupportedOperationException("Unknow expression"));
|
|
throw new LispError(new UnsupportedOperationException("Unknow expression"));
|
|
}
|
|
}
|