diff src/luan/interp/LuanCompiler.java @ 108:3c404a296995

make Package module more standard; return _ENV by default; add "import" statement; git-svn-id: https://luan-java.googlecode.com/svn/trunk@109 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Fri, 23 May 2014 03:21:54 +0000
parents 754e6030c029
children 2428ecfed375
line wrap: on
line diff
--- a/src/luan/interp/LuanCompiler.java	Mon May 19 09:17:57 2014 +0000
+++ b/src/luan/interp/LuanCompiler.java	Fri May 23 03:21:54 2014 +0000
@@ -7,15 +7,43 @@
 import luan.LuanElement;
 import luan.LuanTable;
 import luan.parser.ParseException;
+import java.util.Map;
 
 
 public final class LuanCompiler {
 	private LuanCompiler() {}  // never
 
-	public static LuanFunction compile(LuanState luan,LuanSource src,LuanTable env) throws LuanException {
-		UpValue.Getter envGetter = env!=null ? new UpValue.ValueGetter(env) : new UpValue.EnvGetter();
+	public static LuanFunction compileModule(LuanState luan,LuanSource src) throws LuanException {
+		UpValue.Getter envGetter = new UpValue.EnvGetter();
+		LuanParser parser = new LuanParser(src,envGetter);
+		for( Map.Entry<Object,Object> entry : luan.global() ) {
+			Object key = entry.getKey();
+			if( key instanceof String )
+				parser.addVar( (String)key, entry.getValue() );
+		}
 		try {
-			FnDef fnDef = LuanParser.parse(src,envGetter);
+			FnDef fnDef = parser.RequiredModule();
+			final Closure c = new Closure((LuanStateImpl)luan,fnDef);
+			return new LuanFunction() {
+				public Object[] call(LuanState luan,Object[] args) throws LuanException {
+					Object[] rtn = c.call(luan,args);
+					return rtn.length==0 ? new Object[]{c.upValues()[0].get()} : rtn;
+				}
+			};
+		} catch(ParseException e) {
+//e.printStackTrace();
+			LuanElement le = new LuanSource.CompilerElement(src);
+			throw luan.bit(le).exception( e.getFancyMessage() );
+		}
+	}
+
+	public static LuanFunction compileInteractive(LuanState luan,LuanSource src) throws LuanException {
+		UpValue.Getter envGetter = UpValue.globalGetter;
+		LuanParser parser = new LuanParser(src,envGetter);
+		try {
+			FnDef fnDef = parser.Expressions();
+			if( fnDef == null )
+				fnDef = parser.RequiredModule();
 			return new Closure((LuanStateImpl)luan,fnDef);
 		} catch(ParseException e) {
 //e.printStackTrace();