diff core/src/luan/impl/LuanParser.java @ 648:e387e4021afe

start compiler with len operator
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 30 Mar 2016 19:40:48 -0600
parents 859c0dedc8b6
children 37f0cf43f191
line wrap: on
line diff
--- a/core/src/luan/impl/LuanParser.java	Tue Mar 29 20:39:14 2016 -0600
+++ b/core/src/luan/impl/LuanParser.java	Wed Mar 30 19:40:48 2016 -0600
@@ -661,8 +661,10 @@
 		parser.begin();
 		if( parser.match('#') ) {
 			Spaces(in);
-			Expressions exp = UnaryExpr(in);
-			return parser.success( new LenExpr( required(expr(exp)) ) );
+			Expressions exp = required(UnaryExpr(in));
+			String code = "$Luan.len($luan," + expressionsToExprString(exp) + ")";
+			exp = stringToExpressions(code);
+			return parser.success(exp);
 		}
 		if( Minus() ) {
 			Spaces(in);
@@ -1347,4 +1349,43 @@
 		return parser.success();
 	}
 
+
+
+
+	private static String expressionsToExprString(Expressions exp) {
+		int i = $Luan.addExpressions(exp);
+		String s = "$Luan.getExpressions(" + i + ").eval($luan)";
+		if( !(exp instanceof Expr) )
+			s = "$Luan.first(" + s + ")";
+		return s;
+	}
+
+	private static int classCounter = 0;
+
+	private static Expressions stringToExpressions(String code) {
+		String className = "EXP" + ++classCounter;
+		String classCode = ""
+			+"package luan.impl;\n"
+//			+"import luan.impl.$Luan;\n"
+//			+"import luan.impl.Expressions;\n"
+			+"import luan.LuanException;\n"
+			+"\n"
+			+"public class " + className +" implements Expressions {\n"
+			+"	@Override public Object eval(LuanStateImpl $luan) throws LuanException {\n"
+			+"		return " + code + ";\n"
+			+"	}\n"
+			+"}\n"
+		;
+		try {
+			Class cls = LuanJavaCompiler.compile("luan.impl."+className,code,classCode);
+			return (Expressions)cls.newInstance();
+		} catch(ClassNotFoundException e) {
+			throw new RuntimeException(e);
+		} catch(InstantiationException e) {
+			throw new RuntimeException(e);
+		} catch(IllegalAccessException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
 }