@@ -108,8 +108,12 @@ } Value lift(in LexPosition pos, Value v, Layer lay, Table callerCtx) { + // functions are automatically lifterd + if( cast(FunValue) v ) + return v; + // similar to invoke Function, but with only one argument bound to ValueLayer Value _f = callerCtx.get(lay, SystemLayer, pos); if(auto f = cast(FunValue)_f) { @@ -154,13 +158,12 @@ (VarExpression e) { if( lay == ValueLayer ) return ctx.get(e.name, lay, e.pos); - try { + if( ctx.has(e.name, lay, e.pos) ) return ctx.get(e.name, lay, e.pos); - } catch( Throwable ) { // [TODO] more precise... + else return lift(e.pos, ctx.get(e.name, ValueLayer, e.pos), lay, ctx); - } }, (LayExpression e) { if( e.layer == MacroLayer ) @@ -183,13 +186,8 @@ return invokeFunction(e.pos, eval(e.fun, ctx, true, lay), e.args, ctx, lay); }, (FunLiteral e) { - Value[Value[]][Layer] memo; - AST macroMemo = null; // cache - - // funvalue need not be rised - // no, need to be rised !! suppose @t(fib)("int") return new UserDefinedFunValue(e, ctx); }, delegate Value (AST e) { @@ -240,11 +238,11 @@ return t; }, (VarExpression e) { - try { + if( ctx.has(e.name, MacroLayer, e.pos) ) return ctx.get(e.name, MacroLayer, e.pos); - } catch( Throwable ) {// [TODO] more precies... + else { Table t = new Table; t.set("pos", theLayer, pos); t.set("is", theLayer, new StrValue("var")); t.set("name", theLayer, new StrValue(e.name));