Sfoglia il codice sorgente

Implementation cons

Arthur Brandao 6 anni fa
parent
commit
b6a77eec81
2 ha cambiato i file con 44 aggiunte e 1 eliminazioni
  1. 28 1
      src/migl/lisp/LispImpl.java
  2. 16 0
      src/migl/util/ConsListFactory.java

+ 28 - 1
src/migl/lisp/LispImpl.java

@@ -62,7 +62,31 @@ public class LispImpl implements Lisp {
 			if(lisp.size() != 2) {
 				throw new LispError(LispError.ERR_NUM_ARG);
 			}
-			return null;
+			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) {
@@ -404,6 +428,9 @@ public class LispImpl implements Lisp {
 	 * @throws LispError
 	 */
 	private static LispElement evaluateList(ConsList<Object> lisp) throws LispError {
+		if(lisp.isEmpty()) {
+			return LispElement.generate("()");
+		}
 		LispOperator op = operators.get(LispElement.generate(lisp.car()).toStr());
 		if(op == null) {
 			throw new LispError(new UnsupportedOperationException("Unknow expression"));

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

@@ -1,5 +1,8 @@
 package migl.util;
 
+import java.util.LinkedList;
+import java.util.Queue;
+
 /**
  * Factory to create new lists.
  * 
@@ -61,4 +64,17 @@ 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;
+	}
 }