|
@@ -129,16 +129,24 @@ public class DefineOperator implements LispOperator {
|
|
|
return eval(lisp.cdr());
|
|
|
}
|
|
|
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
private LispElement lambda(String operator, ConsList<Object> lisp) throws LispError {
|
|
|
if(!isLambda(operator)) {
|
|
|
throw new LispError(operator + LispError.ERR_UNKNOW);
|
|
|
}
|
|
|
//Recup les infos
|
|
|
- ConsList<Object> lambda = (ConsList<Object>) define.get(operator).car();
|
|
|
- ConsList<Object> param = (ConsList<Object>) lambda.cdr().car();
|
|
|
- lambda = (ConsList<Object>) lambda.cdr().cdr().car();
|
|
|
- if(param.size() != lisp.size()) {
|
|
|
- throw new LispError(LispError.ERR_NUM_ARG);
|
|
|
+ ConsList<Object> lambda;
|
|
|
+ ConsList<Object> param;
|
|
|
+ try {
|
|
|
+ lambda = (ConsList<Object>) define.get(operator).car();
|
|
|
+ param = (ConsList<Object>) lambda.cdr().car();
|
|
|
+ lambda = (ConsList<Object>) lambda.cdr().cdr().car();
|
|
|
+ if(param.size() != lisp.size()) {
|
|
|
+ throw new LispError(LispError.ERR_NUM_ARG);
|
|
|
+ }
|
|
|
+ } catch (Exception ex) {
|
|
|
+ //Lambda mal formée
|
|
|
+ throw new LispError(operator + LispError.ERR_INVALID, ex);
|
|
|
}
|
|
|
//Remplace les parametres
|
|
|
String lispExpr = lambda.toString();
|