|
@@ -45,17 +45,19 @@ public class LispImpl implements Lisp {
|
|
|
return LispElement.generate(result);
|
|
|
});
|
|
|
operators.put("and", (lisp) -> {
|
|
|
- if(lisp.size() != 2) {
|
|
|
- throw new LispError(LispError.ERR_NUM_ARG);
|
|
|
+ boolean result = true;
|
|
|
+ while(!lisp.isEmpty()) {
|
|
|
+ result = result && getElement(lisp.car()).toBoolean();
|
|
|
+ lisp = lisp.cdr();
|
|
|
}
|
|
|
- boolean result = getElement(lisp.car()).toBoolean() && getElement(lisp.cdr().car()).toBoolean();
|
|
|
return LispElement.generate(result);
|
|
|
});
|
|
|
operators.put("or", (lisp) -> {
|
|
|
- if(lisp.size() != 2) {
|
|
|
- throw new LispError(LispError.ERR_NUM_ARG);
|
|
|
+ boolean result = false;
|
|
|
+ while(!lisp.isEmpty()) {
|
|
|
+ result = result || getElement(lisp.car()).toBoolean();
|
|
|
+ lisp = lisp.cdr();
|
|
|
}
|
|
|
- boolean result = getElement(lisp.car()).toBoolean() || getElement(lisp.cdr().car()).toBoolean();
|
|
|
return LispElement.generate(result);
|
|
|
});
|
|
|
operators.put("cons", (lisp) -> {
|