Sfoglia il codice sorgente

Separation operateur cons dans une class

Arthur Brandao 6 anni fa
parent
commit
6e4a53f5bc

+ 3 - 31
src/migl/lisp/LispImpl.java

@@ -8,6 +8,7 @@ import java.util.Queue;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import migl.lisp.operator.ConsOperator;
 import migl.util.ConsList;
 import migl.util.ConsListFactory;
 
@@ -21,6 +22,7 @@ public class LispImpl implements Lisp {
 	private static Map<String, LispOperator> operators = new HashMap<>();
 	static {
 		//Définition des opérateurs
+		operators.put("cons", new ConsOperator());
 		operators.put("quote", (lisp) -> {
 			if(lisp.size() != 1) {
 				throw new LispError(LispError.ERR_NUM_ARG);
@@ -60,36 +62,6 @@ public class LispImpl implements Lisp {
 			}
 			return LispElement.generate(result);
 		});
-		operators.put("cons", (lisp) -> {
-			if(lisp.size() != 2) {
-				throw new LispError(LispError.ERR_NUM_ARG);
-			}
-			ConsList<Object> cl;
-			if(lisp.cdr().car() instanceof ConsList) {
-				//Recup + evaluation de la liste
-				cl = (ConsList<Object>) lisp.cdr().car();
-				cl = ConsListFactory.parse(evaluateList(cl).toString());
-				//Ajoute la valeur de gauche devant
-				if(lisp.car() instanceof ConsList) {
-					//Si la valeur gauche est aussi une liste on evalue sa valaue
-					ConsList<Object> cltemp = (ConsList<Object>) lisp.car();
-					cl = cl.prepend(evaluateList(cltemp).value);
-				} else {
-					cl = cl.prepend(lisp.car());
-				}
-			} else {
-				LispElement le;
-				if(lisp.car() instanceof ConsList) {
-					//Si l'element est une liste on evalue sa valeur
-					ConsList<Object> cltemp = (ConsList<Object>) lisp.car();
-					le = evaluateList(cltemp);
-				} else {
-					le = LispElement.generate(lisp.car());
-				}
-				cl = ConsListFactory.asList(le + " . " + lisp.cdr().car());
-			}
-			return LispElement.generate(cl.toString());
-		});
 		operators.put(">", (lisp) -> {
 			if(lisp.size() == 0) {
 				throw new LispError(LispError.ERR_NUM_ARG);
@@ -458,7 +430,7 @@ public class LispImpl implements Lisp {
 	 * @throws LispError
 	 */
 	@SuppressWarnings("unchecked")
-	private static LispElement getElement(Object elt) throws LispError {
+	public static LispElement getElement(Object elt) throws LispError {
 		if(elt instanceof ConsList) {
 			return evaluateList((ConsList<Object>) elt);
 		}

+ 59 - 0
src/migl/lisp/operator/ConsOperator.java

@@ -0,0 +1,59 @@
+package migl.lisp.operator;
+
+import migl.lisp.LispElement;
+import migl.lisp.LispError;
+import migl.lisp.LispImpl;
+import migl.lisp.LispOperator;
+import migl.util.ConsList;
+import migl.util.ConsListFactory;
+
+public class ConsOperator implements LispOperator {
+
+	@Override
+	public LispElement apply(ConsList<Object> lisp) throws LispError {
+		if(lisp.size() != 2) {
+			throw new LispError(LispError.ERR_NUM_ARG);
+		}
+		ConsList<Object> cl;
+		if(lisp.cdr().car() instanceof ConsList) {
+			//Recup + evaluation de la liste
+			cl = this.parseList(LispImpl.getElement(lisp.cdr().car()).toString());
+			//Ajoute la valeur de gauche devant
+			if(lisp.car() instanceof ConsList) {
+				//Si la valeur gauche est aussi une liste on evalue sa valaue
+				cl = cl.prepend(LispImpl.getElement(lisp.car()).value);
+			} else {
+				cl = cl.prepend(lisp.car());
+			}
+		} else {
+			LispElement le;
+			if(lisp.car() instanceof ConsList) {
+				//Si l'element est une liste on evalue sa valeur
+				le = LispImpl.getElement(lisp.car());
+			} else {
+				le = LispElement.generate(lisp.car());
+			}
+			cl = ConsListFactory.asList(le + " . " + lisp.cdr().car());
+		}
+		return LispElement.generate(cl.toString());
+	}
+	
+	/**
+	 * Parse une chaine en ConsList
+	 * @param expr L'expression à parser
+	 * @return
+	 */
+	public ConsList<Object> parseList(String expr){
+		ConsList<Object> list = ConsListFactory.nil();
+		//Parse d'une liste simple - ToDO parse toutes sorte de liste
+		String[] tmp = expr.trim().split("[ |\t]");
+		for(String str : tmp) {
+			str = str.replaceAll("[\\(|\\)]", "").trim();
+			if(str.length() > 0) {
+				list = list.append(str);
+			}
+		}
+		return list;
+	}
+
+}

+ 0 - 15
src/migl/util/ConsListFactory.java

@@ -1,8 +1,5 @@
 package migl.util;
 
-import java.util.LinkedList;
-import java.util.Queue;
-
 /**
  * Factory to create new lists.
  * 
@@ -65,16 +62,4 @@ public final class ConsListFactory {
 		return list;
 	}
 	
-	public static <T> ConsList<T> parse(String expr){
-		ConsList<T> list = nil();
-		//Parse d'une liste simple - ToDO parse toutes sorte de liste
-		String[] tmp = expr.trim().split("[ |\t]");
-		for(String str : tmp) {
-			str = str.replaceAll("[\\(|\\)]", "");
-			if(str.trim().length() > 0) {
-				list = list.append((T) str.trim());
-			}
-		}
-		return list;
-	}
 }