Differences From Artifact [0e6e0e9d77fcbedc]:
- File        
polemy/eval.d
- 2010-11-21 09:53:17 - part of checkin [435fa085ec] on branch trunk - refactored predefined layer names, and filled readme.txt. (user: kinaba) [annotate]
 
 
To Artifact [c85d31e67d8ceb4b]:
- File        
polemy/eval.d
- 2010-11-21 14:24:33 - part of checkin [3995a5eb6a] on branch trunk - added iikagen pattern match (user: kinaba) [annotate]
 
 
    29     29    ctx.set(">", ValueLayer, native( (Value lhs, Value rhs){return new IntValue(BigInt(lhs > rhs ? 1: 0));} ));
    30     30    ctx.set("<=", ValueLayer, native( (Value lhs, Value rhs){return new IntValue(BigInt(lhs <= rhs ? 1: 0));} ));
    31     31    ctx.set(">=", ValueLayer, native( (Value lhs, Value rhs){return new IntValue(BigInt(lhs >= rhs ? 1: 0));} ));
    32     32    ctx.set("==", ValueLayer, native( (Value lhs, Value rhs){return new IntValue(BigInt(lhs == rhs ? 1: 0));} ));
    33     33    ctx.set("!=", ValueLayer, native( (Value lhs, Value rhs){return new IntValue(BigInt(lhs != rhs ? 1: 0));} ));
    34     34    ctx.set("print", ValueLayer, native( (Value a){
    35     35     writeln(a);
    36         -  return new IntValue(BigInt(178));
           36  +  return new IntValue(BigInt(0));
    37     37    }));
    38     38    ctx.set("if", ValueLayer, native( (IntValue x, FunValue ft, FunValue fe){
    39     39     auto toRun = (x.data==0 ? fe : ft);
           40  +  // [TODO] fill positional information
    40     41     return toRun.invoke(null, ValueLayer, toRun.definitionContext());
    41     42   //  return toRun.invoke(pos, lay, toRun.definitionContext());
    42     43    }));
    43     44    ctx.set("_isint", ValueLayer, native( (Value v){return new IntValue(BigInt(cast(IntValue)v is null ? 0 : 1));} ));
    44     45    ctx.set("_isstr", ValueLayer, native( (Value v){return new IntValue(BigInt(cast(StrValue)v is null ? 0 : 1));} ));
    45     46    ctx.set("_isfun", ValueLayer, native( (Value v){return new IntValue(BigInt(cast(FunValue)v is null ? 0 : 1));} ));
    46     47    ctx.set("_isundefined", ValueLayer, native( (Value v){return new IntValue(BigInt(cast(UndValue)v is null ? 0 : 1));} ));
................................................................................
   149    150       return v;
   150    151      else // rise
   151    152       return lift(e.pos,v,lay,ctx);
   152    153     },
   153    154     (VarExpression e)
   154    155     {
   155    156      if( lay == ValueLayer )
   156         -    return ctx.get(e.var, lay, e.pos);
          157  +    return ctx.get(e.name, lay, e.pos);
   157    158      try {
   158         -    return ctx.get(e.var, lay, e.pos);
          159  +    return ctx.get(e.name, lay, e.pos);
   159    160      } catch( Throwable ) { // [TODO] more precise...
   160         -    return lift(e.pos, ctx.get(e.var, ValueLayer, e.pos), lay, ctx);
          161  +    return lift(e.pos, ctx.get(e.name, ValueLayer, e.pos), lay, ctx);
   161    162      }
   162    163     },
   163         -  (LayeredExpression e)
          164  +  (LayExpression e)
   164    165     {
   165         -   if( e.lay == MacroLayer )
          166  +   if( e.layer == MacroLayer )
   166    167       return macroEval(e.expr, ctx, false);
   167    168      else
   168         -    return eval(e.expr, ctx, true, e.lay);
          169  +    return eval(e.expr, ctx, true, e.layer);
   169    170     },
   170    171     (LetExpression e)
   171    172     {
   172    173      // for letrec, we need this, but should avoid overwriting????
   173    174      // ctx.set(e.var, ValueLayer, new UndefinedValue, e.pos);
   174    175      if(splitCtx)
   175    176       ctx = new Table(ctx, Table.Kind.NotPropagateSet);
   176    177      Value v = eval(e.init, ctx, true, lay);
   177         -   ctx.set(e.var, (e.layer.length ? e.layer : lay), v, e.pos);
          178  +   ctx.set(e.name, (e.layer.length ? e.layer : lay), v, e.pos);
   178    179      return eval(e.expr, ctx, false, lay);
   179    180     },
   180    181     (FuncallExpression e)
   181    182     {
   182    183      return invokeFunction(e.pos, eval(e.fun, ctx, true, lay), e.args, ctx, lay);
   183    184     },
   184    185     (FunLiteral e)
................................................................................
   197    198    );
   198    199   }
   199    200   
   200    201   // [TODO] Optimization
   201    202   Value macroEval(AST e, Table ctx, bool AlwaysMacro)
   202    203   {
   203    204    Layer theLayer = ValueLayer;
          205  +
          206  + Table makeCons(Value a, Value d)
          207  + {
          208  +  Table t = new Table;
          209  +  t.set("car", theLayer, a);
          210  +  t.set("cdr", theLayer, d);
          211  +  return t;
          212  + }
   204    213   
   205    214    Table pos = new Table;
   206         - pos.set("filename", theLayer, new StrValue(e.pos.filename));
   207         - pos.set("lineno",   theLayer, new IntValue(BigInt(e.pos.lineno)));
   208         - pos.set("column",   theLayer, new IntValue(BigInt(e.pos.column)));
          215  + if( e.pos !is null ) {
          216  +  pos.set("filename", theLayer, new StrValue(e.pos.filename));
          217  +  pos.set("lineno",   theLayer, new IntValue(BigInt(e.pos.lineno)));
          218  +  pos.set("column",   theLayer, new IntValue(BigInt(e.pos.column)));
          219  + } else {
          220  +  pos.set("filename", theLayer, new StrValue("nullpos"));
          221  +  pos.set("lineno",   theLayer, new IntValue(BigInt(0)));
          222  +  pos.set("column",   theLayer, new IntValue(BigInt(0)));
          223  + }
          224  +
   209    225    return e.match(
   210    226     (StrLiteral e)
   211    227     {
   212    228      Table t = new Table;
   213    229      t.set("pos",  theLayer, pos);
   214    230      t.set("is",   theLayer, new StrValue("str"));
   215    231      t.set("data", theLayer, new StrValue(e.data));
................................................................................
   222    238      t.set("is",   theLayer, new StrValue("int"));
   223    239      t.set("data", theLayer, new IntValue(e.data));
   224    240      return t;
   225    241     },
   226    242     (VarExpression e)
   227    243     {
   228    244      try {
   229         -    return ctx.get(e.var, MacroLayer, e.pos);
          245  +    return ctx.get(e.name, MacroLayer, e.pos);
   230    246      } catch( Throwable ) {// [TODO] more precies...
   231    247       Table t = new Table;
   232    248       t.set("pos",  theLayer, pos);
   233    249       t.set("is",   theLayer, new StrValue("var"));
   234         -    t.set("name", theLayer, new StrValue(e.var));
          250  +    t.set("name", theLayer, new StrValue(e.name));
   235    251       return cast(Value)t;
   236    252      }
   237    253     },
   238         -  (LayeredExpression e)
          254  +  (LayExpression e)
   239    255     {
   240    256      if( AlwaysMacro )
   241    257      {
   242    258       Table t = new Table;
   243         -    t.set("pos",  theLayer, pos);
   244         -    t.set("is",   theLayer, new StrValue("lay"));
   245         -    t.set("layer",   theLayer, new StrValue(e.lay));
   246         -    t.set("expr", theLayer, macroEval(e.expr,ctx,AlwaysMacro));
          259  +    t.set("pos",   theLayer, pos);
          260  +    t.set("is",    theLayer, new StrValue("lay"));
          261  +    t.set("layer", theLayer, new StrValue(e.layer));
          262  +    t.set("expr",  theLayer, macroEval(e.expr,ctx,AlwaysMacro));
   247    263       return cast(Value)t;
   248    264      }
   249    265      else
   250    266      {
   251         -    if( e.lay == MacroLayer )
          267  +    if( e.layer == MacroLayer )
   252    268        return macroEval(e.expr, ctx, false);
   253    269       else
   254         -     return eval(e.expr, ctx, true, e.lay);
          270  +     return eval(e.expr, ctx, true, e.layer);
   255    271      }
   256    272     },
   257    273     (LetExpression e)
   258    274     {
   259    275      Table t = new Table;
   260    276      t.set("pos",  theLayer, pos);
   261    277      t.set("is",   theLayer, new StrValue("let"));
   262         -   t.set("name", theLayer, new StrValue(e.var));
          278  +   t.set("name", theLayer, new StrValue(e.name));
   263    279      t.set("init", theLayer, macroEval(e.init,ctx,AlwaysMacro));
   264    280      t.set("expr", theLayer, macroEval(e.expr,ctx,AlwaysMacro));
   265    281      return t;
   266    282     },
   267    283     (FuncallExpression e)
   268    284     {
   269    285      Value _f = macroEval(e.fun,ctx,AlwaysMacro);
................................................................................
   278    294      Table args = new Table;
   279    295      foreach_reverse(a; e.args) {
   280    296       Table cons = new Table;
   281    297       cons.set("car",theLayer,macroEval(a,ctx,AlwaysMacro));
   282    298       cons.set("cdr",theLayer,args);
   283    299       args = cons;
   284    300      }
   285         -   t.set("arg", theLayer, args);
          301  +   t.set("args", theLayer, args);
   286    302      return cast(Value)t;
   287    303     },
   288    304     (FunLiteral e)
   289    305     {
   290    306      Table t = new Table;
   291    307      t.set("pos",   theLayer, pos);
   292    308      t.set("is",    theLayer, new StrValue("fun"));
   293         -   t.set("body",  theLayer, macroEval(e.funbody,ctx,AlwaysMacro));
   294         -   Table param = new Table;
          309  +   t.set("funbody",  theLayer, macroEval(e.funbody,ctx,AlwaysMacro));
          310  +   Table params = new Table;
   295    311      foreach_reverse(p; e.params)
   296    312      {
   297         -    Table cons = new Table;
          313  +    Table lays = new Table;
          314  +    foreach_reverse(lay; p.layers)
          315  +     lays = makeCons(new StrValue(lay), lays);
   298    316       Table kv = new Table;
   299    317       kv.set("name", theLayer, new StrValue(p.name));
   300         -    foreach_reverse(lay; p.layers)
   301         -    {
   302         -     Table cons2 = new Table;
   303         -     cons2.set("car", theLayer, new StrValue(lay));
   304         -     cons2.set("cdr", theLayer, kv);
   305         -     kv = cons2;
   306         -    }
   307         -    cons.set("car", theLayer, kv);
   308         -    cons.set("cdr", theLayer, param);
   309         -    param = cons;
          318  +    kv.set("layers", theLayer, lays);
          319  +    Table cons = new Table;
          320  +    params = makeCons(kv, params);
   310    321      }
   311         -   t.set("param", theLayer, param);
          322  +   t.set("params", theLayer, params);
   312    323      return t;
   313    324     },
   314    325     delegate Value (AST e)
   315    326     {
   316    327      throw genex!RuntimeException(e.pos, sprintf!"Unknown Kind of Expression %s"(typeid(e)));
   317    328     }
   318    329    );
................................................................................
   342    353   unittest
   343    354   {
   344    355    assert_eq( evalString(`@a x=1; @b x=2; @a(x)`).val, new IntValue(BigInt(1)) );
   345    356    assert_eq( evalString(`@a x=1; @b x=2; @b(x)`).val, new IntValue(BigInt(2)) );
   346    357    assert_eq( evalString(`let x=1; let _ = (@a x=2;2); x`).val, new IntValue(BigInt(1)) );
   347    358    assert_throw!Throwable( evalString(`let x=1; let _ = (@a x=2;2); @a(x)`) );
   348    359   }
   349         -
          360  +/*
   350    361   unittest
   351    362   {
   352    363    assert_eq( evalString(`var fac = fun(x){
   353    364     if(x)
   354    365      { x*fac(x-1); }
   355    366     else
   356    367      { 1; };
................................................................................
   379    390    // there was a bug that declaration in the first line of function definition
   380    391    // cannot be recursive
   381    392    assert_nothrow( evalString(`def foo() {
   382    393     def bar(y) { if(y<1) {0} else {bar(0)} };
   383    394     bar(1)
   384    395   }; foo()`) );
   385    396   }
          397  +*/