Differences From Artifact [74dd93745d781116]:
- File
polemy/eval.d
- 2010-11-26 05:03:10 - part of checkin [207cea338a] on branch trunk - changed hiding mechanizem of x in let x = ... for @macro layer. Old: set(x,ValueLayer,undefined) Nee: set(x,NoopLayer,null) (user: kinaba) [annotate]
To Artifact [56f0a662740b0906]:
- File
polemy/eval.d
- 2010-11-26 05:29:24 - part of checkin [f8684f4d69] on branch trunk - changed the desugaring of >>@macro x=e from >>@macro x=e in x to >>@macro x=e in "(macro definition)" for convenience during REPL interaction (user: kinaba) [annotate]
135 135
136 136 Value eval( Let e, Layer lay, Table ctx, bool overwriteCtx=CascadeCtx )
137 137 {
138 138 Table newCtx = overwriteCtx ? ctx : new Table(ctx, Table.Kind.NotPropagateSet);
139 139 if( isASTLayer(lay) )
140 140 return ast2table(e, (AST ee){
141 141 // need this for correct scoping (outer scope macro variables must be hidden!)
142 - if(ee is e.expr)
142 + if(e.name!="_" && ee is e.expr)
143 143 newCtx.set(e.name, NoopLayer, null);
144 144 return eval(ee,lay,newCtx);
145 145 });
146 146 else
147 147 {
148 148 Value ri = eval(e.init, lay, newCtx);
149 - newCtx.set(e.name, e.layer.empty ? lay : e.layer, ri);
149 + if(e.name!="_")
150 + newCtx.set(e.name, e.layer.empty ? lay : e.layer, ri);
150 151 return eval(e.expr, lay, newCtx, OverwriteCtx);
151 152 }
152 153 }
153 154
154 155 private:
155 156 // little little bit incremental macro defining version.
156 157 // enables @macro foo(x)=... in ... foo ..., only at the top level of the
................................................................................
459 460 }
460 461 unittest
461 462 {
462 463 auto e = new Evaluator;
463 464 enrollRuntimeLibrary(e);
464 465 assert_nothrow( e.evalString(`case 1`) );
465 466 assert_nothrow( e.evalString(`case 1 when 1: 2`) );
467 +
468 + // this is a shorthand for
469 + // @macro x = fun(){} in @macro(x)
470 + // so it is ok to fail, but it is really incovenient on REPL
471 + assert_nothrow( e.evalString(`@macro x=fun(){}`) );
466 472 }
467 473
468 474 /*
469 475 unittest
470 476 {
471 477 assert_eq( evalString(`var fac = fun(x){
472 478 if(x)