|
@@ -10,6 +10,7 @@ import migl.lisp.operator.DefineOperator;
|
|
import migl.lisp.operator.MathOperator;
|
|
import migl.lisp.operator.MathOperator;
|
|
import migl.lisp.operator.MinMaxOperator;
|
|
import migl.lisp.operator.MinMaxOperator;
|
|
import migl.util.ConsList;
|
|
import migl.util.ConsList;
|
|
|
|
+import migl.util.ConsListFactory;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Evaluateur lisp
|
|
* Evaluateur lisp
|
|
@@ -85,7 +86,10 @@ public class LispEval {
|
|
operators.put("define", this.define);
|
|
operators.put("define", this.define);
|
|
operators.put("set!", this.define);
|
|
operators.put("set!", this.define);
|
|
operators.put("lambda", this.define);
|
|
operators.put("lambda", this.define);
|
|
- operators.put("cons", new ConsOperator());
|
|
|
|
|
|
+ ConsOperator cons = new ConsOperator();
|
|
|
|
+ operators.put("cons", cons);
|
|
|
|
+ operators.put("car", cons);
|
|
|
|
+ operators.put("cdr", cons);
|
|
ComparatorOperator comp = new ComparatorOperator();
|
|
ComparatorOperator comp = new ComparatorOperator();
|
|
operators.put(">", comp);
|
|
operators.put(">", comp);
|
|
operators.put(">=", comp);
|
|
operators.put(">=", comp);
|
|
@@ -230,6 +234,41 @@ public class LispEval {
|
|
}
|
|
}
|
|
return LispElement.generate(Math.pow(eval.getElement(lisp.car()).toNumber(), eval.getElement(lisp.cdr().car()).toNumber()));
|
|
return LispElement.generate(Math.pow(eval.getElement(lisp.car()).toNumber(), eval.getElement(lisp.cdr().car()).toNumber()));
|
|
});
|
|
});
|
|
|
|
+ operators.put("list", (eval, op, lisp) -> {
|
|
|
|
+ LispList list = LispList.nil();
|
|
|
|
+ while(!lisp.isEmpty()) {
|
|
|
|
+ list.append(eval.getElement(lisp.car()));
|
|
|
|
+ lisp = lisp.cdr();
|
|
|
|
+ }
|
|
|
|
+ return LispElement.generate(list);
|
|
|
|
+ });
|
|
|
|
+ operators.put("map", (eval, op, lisp) -> {
|
|
|
|
+ if(lisp.size() != 2) {
|
|
|
|
+ throw new LispError(LispError.ERR_NUM_ARG);
|
|
|
|
+ }
|
|
|
|
+ //Regarde si le parametre est une fonction lambda
|
|
|
|
+ if(!eval.getDefine().isLambda(lisp.car())) {
|
|
|
|
+ throw new LispError(lisp.car() + LispError.ERR_INVALID);
|
|
|
|
+ }
|
|
|
|
+ //Regarde si le second parametre est une expression lisp à evaluer
|
|
|
|
+ if(!(lisp.cdr().car() instanceof ConsList)) {
|
|
|
|
+ throw new LispError(lisp.cdr().car() + LispError.ERR_INVALID);
|
|
|
|
+ }
|
|
|
|
+ //Evalue l'expression la valeurs des parametres
|
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
|
+ LispElement res = eval.evaluateList((ConsList<Object>) lisp.cdr().car());
|
|
|
|
+ if(!res.isList()) {
|
|
|
|
+ return LispElement.generate(LispList.nil());
|
|
|
|
+ }
|
|
|
|
+ //Pour chaque element de la liste evalue la fonction
|
|
|
|
+ LispList result = LispList.nil();
|
|
|
|
+ LispList list = res.toList();
|
|
|
|
+ for(int i = 0; i < list.size(); i++) {
|
|
|
|
+ ConsList<Object> cl = ConsListFactory.asList(lisp.car(), list.get(i));
|
|
|
|
+ result.append(eval.evaluateList(cl));
|
|
|
|
+ }
|
|
|
|
+ return LispElement.generate(result);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|