Differences From 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]
 
 
To Artifact [9a9618fb0277f966]:
- File        
polemy/eval.d
- 2010-11-21 15:48:16 - part of checkin [f86026acb8] on branch trunk - macro cache and automemoization reloaded. auto re-run implemented. but automemo and autorerun is currently disabled. we need Table.opCmp... we also need to think more about the memoization (user: kinaba) [annotate]
 
 
  105                  return f.invoke(pos, lay, ctx);                                      105                  return f.invoke(pos, lay, ctx);
  106          }                                                                            106          }
  107          throw genex!RuntimeException(pos, "tried to call non-function");             107          throw genex!RuntimeException(pos, "tried to call non-function");
  108  }                                                                                    108  }
  109                                                                                       109  
  110  Value lift(in LexPosition pos, Value v, Layer lay, Table callerCtx)                  110  Value lift(in LexPosition pos, Value v, Layer lay, Table callerCtx)
  111  {                                                                                    111  {
                                                                                        >   112          // functions are automatically lifterd
                                                                                        >   113          if( cast(FunValue) v )
                                                                                        >   114                  return v;
                                                                                        >   115  
  112          // similar to invoke Function, but with only one argument bound to Value     116          // similar to invoke Function, but with only one argument bound to Value
  113          Value _f = callerCtx.get(lay, SystemLayer, pos);                             117          Value _f = callerCtx.get(lay, SystemLayer, pos);
  114          if(auto f = cast(FunValue)_f)                                                118          if(auto f = cast(FunValue)_f)
  115          {                                                                            119          {
  116                  Table ctx = new Table(f.definitionContext(), Table.Kind.NotPropa     120                  Table ctx = new Table(f.definitionContext(), Table.Kind.NotPropa
  117                  auto ps = f.params();                                                121                  auto ps = f.params();
  118                  if( ps.length != 1 )                                                 122                  if( ps.length != 1 )
................................................................................................................................................................................
  151                          else // rise                                                 155                          else // rise
  152                                  return lift(e.pos,v,lay,ctx);                        156                                  return lift(e.pos,v,lay,ctx);
  153                  },                                                                   157                  },
  154                  (VarExpression e)                                                    158                  (VarExpression e)
  155                  {                                                                    159                  {
  156                          if( lay == ValueLayer )                                      160                          if( lay == ValueLayer )
  157                                  return ctx.get(e.name, lay, e.pos);                  161                                  return ctx.get(e.name, lay, e.pos);
  158                          try {                                                    |   162                          if( ctx.has(e.name, lay, e.pos) )
  159                                  return ctx.get(e.name, lay, e.pos);                  163                                  return ctx.get(e.name, lay, e.pos);
  160                          } catch( Throwable ) { // [TODO] more precise...         |   164                          else
  161                                  return lift(e.pos, ctx.get(e.name, ValueLayer, e     165                                  return lift(e.pos, ctx.get(e.name, ValueLayer, e
  162                          }                                                        <
  163                  },                                                                   166                  },
  164                  (LayExpression e)                                                    167                  (LayExpression e)
  165                  {                                                                    168                  {
  166                          if( e.layer == MacroLayer )                                  169                          if( e.layer == MacroLayer )
  167                                  return macroEval(e.expr, ctx, false);                170                                  return macroEval(e.expr, ctx, false);
  168                          else                                                         171                          else
  169                                  return eval(e.expr, ctx, true, e.layer);             172                                  return eval(e.expr, ctx, true, e.layer);
................................................................................................................................................................................
  180                  },                                                                   183                  },
  181                  (FuncallExpression e)                                                184                  (FuncallExpression e)
  182                  {                                                                    185                  {
  183                          return invokeFunction(e.pos, eval(e.fun, ctx, true, lay)     186                          return invokeFunction(e.pos, eval(e.fun, ctx, true, lay)
  184                  },                                                                   187                  },
  185                  (FunLiteral e)                                                       188                  (FunLiteral e)
  186                  {                                                                    189                  {
  187                          Value[Value[]][Layer] memo;                              <
  188                          AST macroMemo = null; // cache                           <
  189                                                                                   <
  190                          // funvalue need not be rised                            <
  191                          // no, need to be rised !!  suppose @t(fib)("int")       <
  192                          return new UserDefinedFunValue(e, ctx);                      190                          return new UserDefinedFunValue(e, ctx);
  193                  },                                                                   191                  },
  194                  delegate Value (AST e)                                               192                  delegate Value (AST e)
  195                  {                                                                    193                  {
  196                          throw genex!RuntimeException(e.pos, sprintf!"Unknown Kin     194                          throw genex!RuntimeException(e.pos, sprintf!"Unknown Kin
  197                  }                                                                    195                  }
  198          );                                                                           196          );
................................................................................................................................................................................
  237                          t.set("pos",  theLayer, pos);                                235                          t.set("pos",  theLayer, pos);
  238                          t.set("is",   theLayer, new StrValue("int"));                236                          t.set("is",   theLayer, new StrValue("int"));
  239                          t.set("data", theLayer, new IntValue(e.data));               237                          t.set("data", theLayer, new IntValue(e.data));
  240                          return t;                                                    238                          return t;
  241                  },                                                                   239                  },
  242                  (VarExpression e)                                                    240                  (VarExpression e)
  243                  {                                                                    241                  {
  244                          try {                                                    |   242                          if( ctx.has(e.name, MacroLayer, e.pos) )
  245                                  return ctx.get(e.name, MacroLayer, e.pos);           243                                  return ctx.get(e.name, MacroLayer, e.pos);
  246                          } catch( Throwable ) {// [TODO] more precies...          |   244                          else {
  247                                  Table t = new Table;                                 245                                  Table t = new Table;
  248                                  t.set("pos",  theLayer, pos);                        246                                  t.set("pos",  theLayer, pos);
  249                                  t.set("is",   theLayer, new StrValue("var"));        247                                  t.set("is",   theLayer, new StrValue("var"));
  250                                  t.set("name", theLayer, new StrValue(e.name));       248                                  t.set("name", theLayer, new StrValue(e.name));
  251                                  return cast(Value)t;                                 249                                  return cast(Value)t;
  252                          }                                                            250                          }
  253                  },                                                                   251                  },