Mercurial Hosting > luan
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); + } + } + }